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 "&amp;" 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 "&amp;" 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, {"&apos;": "'", "&quot;": '"'})
-  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

Reply via email to