The branch, eden-pre has been updated
via fae846e9d6986a29e376454e15931faa5589957d (commit)
via b75e77636ca465547c703df7095c6a3da5e826a8 (commit)
from 4fa35bfccd54ec33d9275fab58e567c160fe0451 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=fae846e9d6986a29e376454e15931faa5589957d
commit fae846e9d6986a29e376454e15931faa5589957d
Author: spiff <[email protected]>
Date: Sun Jan 29 15:44:23 2012 +0100
[plugin.audio.icecast] updated to version 11.0.1
diff --git a/plugin.audio.icecast/addon.xml b/plugin.audio.icecast/addon.xml
index e48f0d3..259c0e8 100644
--- a/plugin.audio.icecast/addon.xml
+++ b/plugin.audio.icecast/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.audio.icecast"
name="Icecast"
- version="11.0.0"
+ version="11.0.1"
provider-name="Assen Totin">
<requires>
<import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.audio.icecast/default.py b/plugin.audio.icecast/default.py
index e301f51..7a3153b 100755
--- a/plugin.audio.icecast/default.py
+++ b/plugin.audio.icecast/default.py
@@ -1,4 +1,3 @@
-#/*
# * 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 2, or (at your option)
@@ -16,544 +15,174 @@
# *
# */
-import xbmc, xbmcgui, xbmcplugin, xbmcaddon
-import os, urllib2, string, re, htmlentitydefs, time, unicodedata
+import xbmcgui, xbmcplugin, xbmcaddon
-from xml.sax.saxutils import unescape
-from xml.dom import minidom
-from urllib import quote_plus
+from icecast_common import *
+from icecast_init import *
-__XBMC_Revision__ = xbmc.getInfoLabel('System.BuildVersion')
-__settings__ = xbmcaddon.Addon(id='plugin.audio.icecast')
-__language__ = __settings__.getLocalizedString
-__version__ = __settings__.getAddonInfo('version')
-__cwd__ = __settings__.getAddonInfo('path')
-__addonname__ = "Icecast"
-__addonid__ = "plugin.audio.icecast"
-__author__ = "Assen Totin <[email protected]>"
-__credits__ = "Team XBMC"
+__settings__ = xbmcaddon.Addon(id='plugin.audio.icecast')
+__language__ = __settings__.getLocalizedString
+__addonname__ = "Icecast"
+__addonid__ = "plugin.audio.icecast"
+__author__ = "Assen Totin <[email protected]>"
+__credits__ = "Team XBMC"
-BASE_URL = 'http://dir.xiph.org/yp.xml'
+sqlite_con, sqlite_cur, sqlite_is_empty, use_sqlite = initSQLite()
-CHUNK_SIZE = 65536
-
-CACHE_FILE_NAME = 'icecast.cache'
-TIMESTAMP_FILE_NAME = 'icecast.timestamp'
-TIMESTAMP_THRESHOLD = 86400
-
-DB_FILE_NAME = 'icecasl.sqlite'
-DB_CREATE_TABLE_STATIONS = 'CREATE TABLE stations (server_name VARCHAR(255),
listen_url VARCHAR(255), bitrate VARCHAR(255), genre VARCHAR(255));'
-DB_CREATE_TABLE_UPDATES = 'CREATE TABLE updates (unix_timestamp VARCHAR(255));'
-
-# Init function for SQLite
-def initSQLite():
- sqlite_file_name = getSQLiteFileName()
- sqlite_con = sqlite.connect(sqlite_file_name)
- sqlite_cur = sqlite_con.cursor()
- try:
- sqlite_cur.execute(DB_CREATE_TABLE_STATIONS)
- sqlite_cur.execute(DB_CREATE_TABLE_UPDATES)
- putTimestampSQLite(sqlite_con, sqlite_cur)
- sqlite_is_empty = 1
- except:
- sqlite_is_empty = 0
- return sqlite_con, sqlite_cur, sqlite_is_empty
-
-# Parse XML line
-def getText(nodelist):
- rc = []
- for node in nodelist:
- if node.nodeType == node.TEXT_NODE:
- rc.append(node.data)
- return ''.join(rc)
-
-# Obtain the full path of "userdata/add_ons" directory
-def getUserdataDir():
- path = xbmc.translatePath(__settings__.getAddonInfo('profile'))
- if not os.path.exists(path):
- os.makedirs(path)
- return path
-
-# Compose the cache file name
-def getCacheFileName():
- cache_file_dir = getUserdataDir()
- cache_file_name = os.path.join(cache_file_dir,CACHE_FILE_NAME)
- return cache_file_name
-
-# Compose the timestamp file name
-def getTimestampFileName():
- cache_file_dir = getUserdataDir()
- timestamp_file_name = os.path.join(cache_file_dir,TIMESTAMP_FILE_NAME)
- return timestamp_file_name
-
-# Compose the SQLite database file name
-def getSQLiteFileName():
- cache_file_dir = getUserdataDir()
- db_file_name = os.path.join(cache_file_dir,DB_FILE_NAME)
- return db_file_name
-
-# Read the XML list from IceCast server
-def readRemoteXML():
- # Create a dialog
- global dialog_was_canceled
- dialog = xbmcgui.DialogProgress()
- dialog.create(__language__(30093), __language__(30094))
- dialog.update(1)
-
- # Download in chunks of CHUNK_SIZE, update the dialog
- # URL progress bar code taken from triptych
(http://stackoverflow.com/users/43089/triptych):
- # See original code
http://stackoverflow.com/questions/2028517/python-urllib2-progress-hook
- response = urllib2.urlopen(BASE_URL);
- total_size = response.info().getheader('Content-Length').strip()
- total_size = int(total_size)
- bytes_so_far = 0
- str_list = []
- xml = ''
-
- while 1:
- chunk = response.read(CHUNK_SIZE)
- bytes_so_far += len(chunk)
-
- if not chunk: break
-
- if (dialog.iscanceled()):
- dialog_was_canceled = 1
- break
-
- # There are two a bit faster ways to do this: pseudo files (not sure how
portable?) and list comprehensions (lazy about it).
- # As the performance penalty is not that big, I'll stay with the more
straightforward: list + join
- str_list.append(chunk)
-
- percent = float(bytes_so_far) / total_size
- val = int(percent * 100)
- dialog.update(val)
-
- response.close()
-
- if dialog_was_canceled == 0:
- xml = ''.join(str_list)
- dialog.update(100)
- time.sleep(1)
-
- dialog.close
- return xml
-
-# Parse XML to DOM
-def parseXML(xml):
- dom = minidom.parseString(xml)
- return dom
-
-# Read the XML file form local cache
-def readLocalXML():
- cache_file_name = getCacheFileName()
- f = open(cache_file_name,'rb')
- xml = f.read()
- f.close()
- return xml
-
-# Overwrite the local cache
-def writeLocalXML(xml):
- cache_file_name = getCacheFileName()
- f = open(cache_file_name,'wb')
- f.write(xml)
- f.close()
-
-# Populate SQLite table
-def DOMtoSQLite(dom, sqlite_con, sqlite_cur):
- sqlite_cur.execute("DELETE FROM stations")
- sqlite_con.commit()
-
- entries = dom.getElementsByTagName("entry")
- for entry in entries:
-
- listen_url_objects = entry.getElementsByTagName("listen_url")
- for listen_url_object in listen_url_objects:
- listen_url = getText(listen_url_object.childNodes)
- listen_url = re.sub("'","&apos",listen_url)
-
- server_name_objects = entry.getElementsByTagName("server_name")
- for server_name_object in server_name_objects:
- server_name = getText(server_name_object.childNodes)
- server_name = re.sub("'","&apos",server_name)
-
- bitrate_objects = entry.getElementsByTagName("bitrate")
- for bitrate_object in bitrate_objects:
- bitrate = getText(bitrate_object.childNodes)
-
- genre_objects = entry.getElementsByTagName("genre")
- for genre_object in genre_objects:
- genre_name = getText(genre_object.childNodes)
-
- for genre_name_single in genre_name.split():
- genre_name_single = re.sub("'","&apos",genre_name_single)
- sql_query = "INSERT INTO stations (server_name, listen_url, bitrate,
genre) VALUES ('%s','%s','%s','%s')" % (server_name, listen_url, bitrate,
genre_name_single)
- sqlite_cur.execute(sql_query)
-
- sqlite_con.commit()
-
-# Build the list of genres from DOM
-def buildGenreListDom(dom):
- genre_hash = {}
- genres = dom.getElementsByTagName("genre")
- for genre in genres:
- genre_name = getText(genre.childNodes)
- for genre_name_single in genre_name.split():
- if genre_hash.has_key(genre_name_single):
- genre_hash[genre_name_single] += 1
- else:
- genre_hash[genre_name_single] = 1
- for key in sorted(genre_hash.keys()):
- addDir(key, genre_hash[key])
-
-# Build the list of genres from SQLite
-def buildGenreListSQLite(sqlite_cur):
- sqlite_cur.execute("SELECT genre, COUNT(*) AS cnt FROM stations GROUP BY
genre")
- for genre, cnt in sqlite_cur:
- addDir(genre, cnt)
-
-# Add a genre to the list
-def addDir(genre_name, count):
- u = "%s?genre=%s" % (sys.argv[0], genre_name,)
- # Try to unescape HTML-encoding; some strings need two passes - first to
convert "&" to "&" and second to unescape "&XYZ;"!
- genre_name = unescapeString(genre_name)
- genre_name_and_count = "%s (%u streams)" % (genre_name, count)
- liz = xbmcgui.ListItem(genre_name_and_count, iconImage="DefaultFolder.png",
thumbnailImage="")
- liz.setInfo( type="Music", infoLabels={ "Title":
genre_name_and_count,"Size": int(count)} )
- liz.setProperty("IsPlayable","false");
- ok =
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
- return ok
-
-# Build list of links in a given genre from DOM
-def buildLinkListDom(dom, genre_name_orig):
- entries = dom.getElementsByTagName("entry")
-
- for entry in entries:
-
- genre_objects = entry.getElementsByTagName("genre")
- for genre_object in genre_objects:
- genre_name = getText(genre_object.childNodes)
-
- if genre_name.find(genre_name_orig) > -1 :
-
- listen_url_objects = entry.getElementsByTagName("listen_url")
- for listen_url_object in listen_url_objects:
- listen_url = getText(listen_url_object.childNodes)
-
- server_name_objects = entry.getElementsByTagName("server_name")
- for server_name_object in server_name_objects:
- server_name = getText(server_name_object.childNodes)
-
- bitrate_objects = entry.getElementsByTagName("bitrate")
- for bitrate_object in bitrate_objects:
- bitrate = getText(bitrate_object.childNodes)
-
- addLink(server_name, listen_url, bitrate)
-
-# Build list of links in a given genre from SQLite
-def buildLinkListSQLite(sqlite_cur, genre_name_orig):
- sql_query = "SELECT server_name, listen_url, bitrate FROM stations WHERE
genre='%s'" % (genre_name_orig)
- sqlite_cur.execute(sql_query)
- for server_name, listen_url, bitrate in sqlite_cur:
- addLink(server_name, listen_url, bitrate)
-
-# Add a link inside of a genre list
-def addLink(server_name, listen_url, bitrate):
- ok = True
- # Try to unescape HTML-encoding; some strings need two passes - first to
convert "&" to "&" and second to unescape "&XYZ;"!
- server_name = unescapeString(server_name)
- listen_url = unescapeString(listen_url)
- # Try to fix all incorrect values for bitrate (remove letters, reset to 0
etc.)
- bitrate = re.sub('\D','',bitrate)
- try:
- bit = int(bitrate)
- except:
- bit = 0
- u = "%s?play=%s" % (sys.argv[0], listen_url,)
- liz = xbmcgui.ListItem(server_name, iconImage="DefaultVideo.png",
thumbnailImage="")
- liz.setInfo( type="Music", infoLabels={ "Title": server_name,"Size": bit} )
- liz.setProperty("IsPlayable","false");
- ok =
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
- return ok
-
-# Get a search query from keyboard
-def readKbd():
- kb = xbmc.Keyboard("", __language__(30092), False)
- kb.doModal()
- if (kb.isConfirmed() and len(kb.getText()) > 2):
- return kb.getText()
-
-# Do a search in DOM
-def doSearchDom(dom, query):
- entries = dom.getElementsByTagName("entry")
-
- for entry in entries:
-
- genre_objects = entry.getElementsByTagName("genre")
- for genre_object in genre_objects:
- genre_name = getText(genre_object.childNodes)
-
- server_name_objects = entry.getElementsByTagName("server_name")
- for server_name_object in server_name_objects:
- server_name = getText(server_name_object.childNodes)
-
- if ((genre_name.find(query) > -1) or (server_name.find(query) > -1)) :
-
- listen_url_objects = entry.getElementsByTagName("listen_url")
- for listen_url_object in listen_url_objects:
- listen_url = getText(listen_url_object.childNodes)
-
- bitrate_objects = entry.getElementsByTagName("bitrate")
- for bitrate_object in bitrate_objects:
- bitrate = getText(bitrate_object.childNodes)
-
- addLink(server_name, listen_url, bitrate)
-
-# Do a search in SQLite
-def doSearchSQLite(sqlite_cur, query):
- sql_query = "SELECT server_name, listen_url, bitrate FROM stations WHERE
(genre LIKE '@@@%s@@@') OR (server_name LIKE '@@@%s@@@')" % (query, query)
- sql_query = re.sub('@@@','%',sql_query)
- sqlite_cur.execute(sql_query)
- for server_name, listen_url, bitrate in sqlite_cur:
- addLink(server_name, listen_url, bitrate)
-
-# Play a link
-def playLink(listen_url):
- log("PLAY URL: %s" % listen_url )
- xbmc.Player().play(listen_url)
-
-# Read command-line parameters
-def getParams():
- param=[]
- paramstring=sys.argv[2]
- if len(paramstring)>=2:
- params=sys.argv[2]
- cleanedparams=params.replace('?','')
- if (params[len(params)-1]=='/'):
- params=params[0:len(params)-2]
- pairsofparams=cleanedparams.split('&')
- param={}
- for i in range(len(pairsofparams)):
- splitparams={}
- splitparams=pairsofparams[i].split('=')
- if (len(splitparams))==2:
- param[splitparams[0]]=splitparams[1]
- return param
-
-# Logging
-def log(msg):
- xbmc.log("### [%s] - %s" % (__addonname__,msg,),level=xbmc.LOGDEBUG )
-
-# Log NOTICE
-def log_notice(msg):
- xbmc.log("### [%s] - %s" % (__addonname__,msg,),level=xbmc.LOGNOTICE )
-
-# Sorting
-def sort(dir = False):
- if dir:
- xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ),
sortMethod=xbmcplugin.SORT_METHOD_LABEL )
- xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ),
sortMethod=xbmcplugin.SORT_METHOD_SIZE )
- else:
- xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ),
sortMethod=xbmcplugin.SORT_METHOD_LABEL, label2Mask="%X" )
- xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ),
sortMethod=xbmcplugin.SORT_METHOD_BITRATE, label2Mask="%X" )
- xbmcplugin.endOfDirectory(int(sys.argv[1]))
-
-# Unescape escaped HTML characters
-def unescapeHTML(text):
- def fixup(m):
- text = m.group(0)
- if text[:2] == "&#":
- # character reference
- try:
- if text[:3] == "&#x":
- return unichr(int(text[3:-1], 16))
- else:
- return unichr(int(text[2:-1]))
- except ValueError:
- pass
- else:
- # named entity
- try:
- text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
- except KeyError:
- pass
- return text # leave as is
- # Try to avoid broken UTF-8
- try:
- text = unicode(text, 'utf-8')
- ret = re.sub("&#?\w+;", fixup, text)
- except:
- ret = text
- return ret
-
-def unescapeXML(text):
- try:
- ret = unescape(text, {"'": "'", """: '"'})
- except:
- ret = text
- return ret
-
-# Unesacpe wrapper
-def unescapeString(text):
- pass1 = unescapeHTML(text)
- pass2 = unescapeHTML(pass1)
- pass3 = unescapeXML(pass2)
- return pass3
-
-# Functions to read and write unix timestamp to database or file
-def putTimestampSQLite(sqlite_con, sqlite_cur):
- unix_timestamp = int(time.time())
- sql_line = "INSERT INTO updates (unix_timestamp) VALUES (%u)" %
(unix_timestamp)
- sqlite_cur.execute(sql_line)
- sqlite_con.commit()
-
-def putTimestampDom():
- unix_timestamp = int(time.time())
- timestamp_file_name = getTimestampFileName()
- f = open(timestamp_file_name, 'w')
- f.write(str(unix_timestamp))
- f.close()
-
-def getTimestampSQLite(sqlite_cur):
- sqlite_cur.execute("SELECT unix_timestamp FROM updates ORDER BY
unix_timestamp DESC LIMIT 1")
- #unix_timestamp = sqlite_cur.fetchall()
- for unix_timestamp in sqlite_cur:
- return int(unix_timestamp[0])
-
-def getTimestampDom():
- timestamp_file_name = getTimestampFileName()
- try:
- f = open(timestamp_file_name, 'r')
- unix_timestamp = f.read()
- f.close()
- unix_timestamp = int(unix_timestamp)
- except:
- unix_timestamp = 0
- return unix_timestamp
-
-# Timestamp wrappers
-def timestampExpiredSQLite(sqlite_cur):
- current_unix_timestamp = int(time.time())
- saved_unix_timestamp = getTimestampSQLite(sqlite_cur)
- if (current_unix_timestamp - saved_unix_timestamp) > TIMESTAMP_THRESHOLD :
- return 1
- return 0
-
-def timestampExpiredDom():
- current_unix_timestamp = int(time.time())
- saved_unix_timestamp = getTimestampDom()
- if (current_unix_timestamp - saved_unix_timestamp) > TIMESTAMP_THRESHOLD :
- return 1
- return 0
-
-# MAIN
+params=getParams()
-# SQLite support - if available
try:
- # First, try built-in sqlite in Python 2.5 and newer:
- from sqlite3 import dbapi2 as sqlite
- log_notice("Using built-in SQLite via sqlite3!")
- use_sqlite = 1
+ mode = params["mode"]
except:
- # No luck so far: try the external sqlite
- try:
- from pysqlite2 import dbapi2 as sqlite
- log_notice("Using external SQLite via pysqlite2!")
- use_sqlite = 1
- except:
- use_sqlite = 0
- log_notice("SQLite not found -- reverting to older (and slower) text
cache.")
-
-params=getParams()
+ mode = 0
try:
- genre = params["genre"]
+ mod_recent = params["mod_recent"]
except:
- genre = "0";
+ mod_recent = 0
+
try:
- initial = params["initial"]
+ setting = params["setting"]
except:
- initial = "0";
+ setting = 0
+
try:
- play = params["play"]
+ fav_action = params["fav_action"]
except:
- play = "0";
-
-igenre = len(genre)
-iplay = len(play)
-iinitial = len(initial)
+ fav_action = 0
+
+if use_sqlite == 1:
+ from icecast_sql import *
+ timestamp_expired = timestampExpired(sqlite_cur)
+ if (sqlite_is_empty == 1) or (timestamp_expired == 1):
+ xml, dialog_was_canceled = readRemoteXML()
+ if dialog_was_canceled == 0:
+ dom = parseXML(xml)
+ DOMtoSQLite(dom, sqlite_con, sqlite_cur)
+ putTimestamp(sqlite_con, sqlite_cur)
+
+elif use_sqlite == 0:
+ from icecast_dom import *
+ timestamp_expired = timestampExpired()
+ if timestamp_expired == 1:
+ xml, dialog_was_canceled = readRemoteXML()
+ if dialog_was_canceled == 0:
+ writeLocalXML(xml)
+ putTimestamp()
+ elif timestamp_expired == 0:
+ xml = readLocalXML()
+ dom = parseXML(xml)
+
+# Mode selector
+if mode == "search":
+ query = readKbd()
+ if use_sqlite == 1:
+ doSearch(sqlite_cur, query)
+ else:
+ doSearch(dom, query)
+ sort()
-dialog_was_canceled = 0
+elif mode == "list":
+ if use_sqlite == 1:
+ buildGenreList(sqlite_cur)
+ else:
+ buildGenreList(dom)
+ sort(True)
-if igenre > 1 :
+elif mode == "genre":
if use_sqlite == 1:
- sqlite_con, sqlite_cur, sqlite_is_emtpy = initSQLite()
- timestamp_expired = timestampExpiredSQLite(sqlite_cur)
+ timestamp_expired = timestampExpired(sqlite_cur)
if timestamp_expired == 1:
- xml = readRemoteXML()
- if dialog_was_canceled == 0:
+ xml, dialog_was_canceled = readRemoteXML()
+ if dialog_was_canceled == 0:
dom = parseXML(xml)
DOMtoSQLite(dom, sqlite_con, sqlite_cur)
- putTimestampSQLite(sqlite_con, sqlite_cur)
- buildLinkListSQLite(sqlite_cur, genre)
- else :
- timestamp_expired = timestampExpiredDom()
+ putTimestamp(sqlite_con, sqlite_cur)
+ buildLinkList(sqlite_cur, params["genre"])
+ else:
+ timestamp_expired = timestampExpired()
if timestamp_expired == 1:
- xml = readRemoteXML()
+ xml, dialog_was_canceled = readRemoteXML()
if dialog_was_canceled == 0:
writeLocalXML(xml)
- putTimestampDom()
- else:
+ putTimestamp()
+ else:
xml = readLocalXML()
dom = parseXML(xml)
- buildLinkListDom(dom, genre)
+ buildLinkList(dom, params["genre"])
sort()
-elif iinitial > 1:
- if use_sqlite == 1:
- sqlite_con, sqlite_cur, sqlite_is_empty = initSQLite()
- timestamp_expired = timestampExpiredSQLite(sqlite_cur)
- if (sqlite_is_empty == 1) or (timestamp_expired == 1):
- xml = readRemoteXML()
- if dialog_was_canceled == 0:
- dom = parseXML(xml)
- DOMtoSQLite(dom, sqlite_con, sqlite_cur)
- putTimestampSQLite(sqlite_con, sqlite_cur)
+elif mode == "settings":
+ if setting != 0:
+ updateSettings(sqlite_con, sqlite_cur, setting, params["val"])
+ showSettings(sqlite_cur, setting)
- elif use_sqlite == 0:
- timestamp_expired = timestampExpiredDom()
- if timestamp_expired == 1:
- xml = readRemoteXML()
- if dialog_was_canceled == 0:
- writeLocalXML(xml)
- putTimestampDom()
- elif timestamp_expired == 0:
- xml = readLocalXML()
- dom = parseXML(xml)
+elif mode == "recent":
+ showRecent(sqlite_cur)
+ sort()
- if initial == "search":
- query = readKbd()
- if use_sqlite == 1:
- doSearchSQLite(sqlite_cur, query)
+elif mode == "favourites":
+ if fav_action == "open":
+ showFavourite(sqlite_cur, params["url"])
+ elif fav_action == "remove":
+ delFavourite(sqlite_con, sqlite_cur, params["url"])
+ elif fav_action == "add":
+ addFavourite(sqlite_con, sqlite_cur, params["url"])
+ else:
+ fav_msg = favMessage(sqlite_cur)
+ if fav_msg == 1:
+ dialog = xbmcgui.Dialog()
+ dialog.ok(__language__(30098), __language__(30105))
+ elif fav_msg == 2:
+ dialog = xbmcgui.Dialog()
+ dialog.ok(__language__(30098), __language__(30106))
else:
- doSearchDom(dom, query)
- sort()
- elif initial == "list":
- if use_sqlite == 1:
- buildGenreListSQLite(sqlite_cur)
+ showFavourites(sqlite_cur)
+
+elif mode == "play":
+ if use_sqlite == 1:
+ if fav_action == "open":
+ # Add a 'play' link
+ bitrate = getBitrate(sqlite_cur, params["url"])
+ addLink(__language__(30101), params["url"], bitrate, 0)
+ # Add a 'add to favourites' link
+ u = "%s?mode=favourites&url=%s&fav_action=add" % (sys.argv[0],
params["url"])
+ liz = xbmcgui.ListItem(__language__(30099),
iconImage="DefaultAudio.png", thumbnailImage="")
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
+ sortUnsorted()
+ #xbmcplugin.endOfDirectory(int(sys.argv[1]))
else:
- buildGenreListDom(dom)
- sort(True)
-
-elif iplay > 1:
- playLink(play)
-
+ if mod_recent == 0:
+ addRecent(sqlite_con, sqlite_cur, params["url"])
+ playLink(params["url"])
+ else:
+ playLink(params["url"])
+
else:
- u = "%s?initial=list" % (sys.argv[0],)
- liz=xbmcgui.ListItem(__language__(30090), iconImage="DefaultFolder.png",
thumbnailImage="")
-
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
+ u = "%s?mode=list" % (sys.argv[0],)
+ liz=xbmcgui.ListItem(__language__(30090),
iconImage="DefaultMusicGenres.png", thumbnailImage="")
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
- u = "%s?initial=search" % (sys.argv[0],)
+ u = "%s?mode=search" % (sys.argv[0],)
liz=xbmcgui.ListItem(__language__(30091), iconImage="DefaultFolder.png",
thumbnailImage="")
-
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
+
+ if use_sqlite == 1:
+ u = "%s?mode=recent" % (sys.argv[0],)
+ liz=xbmcgui.ListItem(__language__(30104),
iconImage="DefaultMusicRecentlyPlayed.png", thumbnailImage="")
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
+
+ u = "%s?mode=favourites" % (sys.argv[0])
+ liz=xbmcgui.ListItem(__language__(30098),
iconImage="DefaultMusicPlaylists.png", thumbnailImage="")
+ fav_msg = favMessage(sqlite_cur)
+ if fav_msg == 0:
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
+ else:
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
+
+ u = "%s?mode=settings" % (sys.argv[0],)
+ liz=xbmcgui.ListItem(__language__(30095),
iconImage="DefaultAddonMusic.png", thumbnailImage="")
+
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
diff --git a/plugin.audio.icecast/resources/language/English/strings.xml
b/plugin.audio.icecast/resources/language/English/strings.xml
index 14d7519..9772525 100644
--- a/plugin.audio.icecast/resources/language/English/strings.xml
+++ b/plugin.audio.icecast/resources/language/English/strings.xml
@@ -6,4 +6,15 @@
<string id="30092">Enter station name</string>
<string id="30093">Updating local cache...</string>
<string id="30094">Downloading...</string>
+ <string id="30095">Settings</string>
+ <string id="30096">Enable</string>
+ <string id="30097">Disable</string>
+ <string id="30098">Favourites</string>
+ <string id="30099">Add to favourites</string>
+ <string id="30100">Remove from favourites</string>
+ <string id="30101">Play</string>
+ <string id="30102">Done</string>
+ <string id="30104">Recently listened stations</string>
+ <string id="30105">To enable adding favourites, go to the
Settings</string>
+ <string id="30106">To add a favourite, go to the station and chose
Add</string>
</strings>
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=b75e77636ca465547c703df7095c6a3da5e826a8
-----------------------------------------------------------------------
Summary of changes:
plugin.audio.icecast/addon.xml | 2 +-
plugin.audio.icecast/default.py | 641 ++++---------------
plugin.audio.icecast/icecast_common.py | 227 +++++++
plugin.audio.icecast/icecast_dom.py | 146 +++++
plugin.audio.icecast/icecast_init.py | 106 ++++
plugin.audio.icecast/icecast_sql.py | 236 +++++++
.../resources/language/English/strings.xml | 11 +
.../LICENSE.txt | 0
plugin.audio.mozart/README.txt | 34 +
.../addon.xml | 9 +-
plugin.audio.mozart/default.py | 419 +++++++++++++
plugin.audio.mozart/icon.png | Bin 0 -> 116692 bytes
.../resources/__init__.py | 0
plugin.audio.mozart/resources/files/midi.zip | Bin 0 -> 76896 bytes
.../resources/language/English/strings.xml | 8 +
.../resources/lib}/__init__.py | 0
plugin.audio.mozart/resources/lib/midi.py | 424 +++++++++++++
17 files changed, 1751 insertions(+), 512 deletions(-)
create mode 100755 plugin.audio.icecast/icecast_common.py
create mode 100755 plugin.audio.icecast/icecast_dom.py
create mode 100755 plugin.audio.icecast/icecast_init.py
create mode 100755 plugin.audio.icecast/icecast_sql.py
copy {plugin.audio.abradio.cz => plugin.audio.mozart}/LICENSE.txt (100%)
create mode 100644 plugin.audio.mozart/README.txt
copy {plugin.audio.icecast => plugin.audio.mozart}/addon.xml (57%)
create mode 100755 plugin.audio.mozart/default.py
create mode 100644 plugin.audio.mozart/icon.png
copy {plugin.image.iphoto => plugin.audio.mozart}/resources/__init__.py (100%)
create mode 100644 plugin.audio.mozart/resources/files/midi.zip
create mode 100644 plugin.audio.mozart/resources/language/English/strings.xml
copy {plugin.image.iphoto/resources =>
plugin.audio.mozart/resources/lib}/__init__.py (100%)
create mode 100755 plugin.audio.mozart/resources/lib/midi.py
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons