The branch, eden has been updated
via 73226973f908528e7384af06ba647074521e1cba (commit)
via ea64953b4f32c8a32d0bba3578e5b2c2e1e2aa54 (commit)
from dc9411160b67f8c1fa51d246dce5213b1a6de270 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=73226973f908528e7384af06ba647074521e1cba
commit 73226973f908528e7384af06ba647074521e1cba
Author: Martijn Kaijser <[email protected]>
Date: Thu Dec 20 21:33:04 2012 +0100
[script.module.gmusicapi] -2012.11.09
diff --git a/script.module.gmusicapi/addon.xml
b/script.module.gmusicapi/addon.xml
index e63894d..100e4a7 100644
--- a/script.module.gmusicapi/addon.xml
+++ b/script.module.gmusicapi/addon.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.module.gmusicapi"
name="gmusicapi"
- version="2012.05.04"
+ version="2012.11.09"
provider-name="Valentin-Costel HÄloiu">
<requires>
<import addon="xbmc.python" version="2.0"/>
<import addon="script.module.validictory" version="0.8.3"/>
- <import addon="script.module.decorator" version="3.3.2"/>
+ <import addon="script.module.decorator" version="3.3.3"/>
<import addon="script.module.mutagen" version="1.20.0"/>
- <import addon="script.module.protobuf" version="2.4.0"/>
+ <import addon="script.module.protobuf" version="2.4.2"/>
+ <import addon="script.module.chardet" version="2.1.1"/>
</requires>
<extension point="xbmc.python.module"
library="lib" />
diff --git a/script.module.gmusicapi/changelog.txt
b/script.module.gmusicapi/changelog.txt
index bc8d20b..0c05d11 100644
--- a/script.module.gmusicapi/changelog.txt
+++ b/script.module.gmusicapi/changelog.txt
@@ -1,2 +1,5 @@
+[B]2012.11.09[/B]
+- compatibility updates
+
[B]2012.05.04[/B]
- initial Release for XBMC
diff --git a/script.module.gmusicapi/lib/gmusicapi/api.py
b/script.module.gmusicapi/lib/gmusicapi/api.py
index c26103a..91bb640 100644
--- a/script.module.gmusicapi/lib/gmusicapi/api.py
+++ b/script.module.gmusicapi/lib/gmusicapi/api.py
@@ -287,17 +287,15 @@ class Api(UsesLog):
return self._wc_call("loadplaylist", playlist_id)["playlist"]
- def get_all_playlist_ids(self, auto=True, instant=True, user=True,
always_id_lists=False):
+ def get_all_playlist_ids(self, auto=True, user=True,
always_id_lists=False):
"""Returns a dictionary mapping playlist types to dictionaries of
``{"<playlist name>": "<playlist id>"}`` pairs.
Available playlist types are:
* "`auto`" - auto playlists
- * "`instant`" - instant mixes
- * "`user`" - user-defined playlists
+ * "`user`" - user-defined playlists (including instant mixes)
:param auto: make an "`auto`" entry in the result.
- :param instant: make an "`instant`" entry in the result.
:param user: make a "`user`" entry in the result.
:param always_id_lists: when False, map name -> id when there is a
single playlist for that name. When True, always map to a list (which may only
have a single id in it).
@@ -312,8 +310,6 @@ class Api(UsesLog):
if auto:
playlists['auto'] = self._get_auto_playlists()
- if instant:
- playlists['instant'] =
self._playlist_list_to_dict(res['magicPlaylists'])
if user:
playlists['user'] = self._playlist_list_to_dict(res['playlists'])
@@ -339,7 +335,7 @@ class Api(UsesLog):
#Auto playlist ids are hardcoded in the wc javascript.
#If Google releases Music internationally, this will probably be
broken.
- #TODO: how to test for this? if loaded, will the calls just fail?
+ #When testing, an incorrect name here will be caught.
return {"Thumbs up": "auto-playlist-thumbs-up",
"Last added": "auto-playlist-recent",
"Free and purchased": "auto-playlist-promo"}
@@ -713,7 +709,7 @@ class Api(UsesLog):
try:
for orig_fn in filenames:
- extension = orig_fn.split(".")[-1]
+ extension = orig_fn.split(".")[-1].lower()
if extension == "mp3":
all_file_handles.append(file(orig_fn))
diff --git a/script.module.gmusicapi/lib/gmusicapi/protocol.py
b/script.module.gmusicapi/lib/gmusicapi/protocol.py
index fd9c456..0f2b0f7 100644
--- a/script.module.gmusicapi/lib/gmusicapi/protocol.py
+++ b/script.module.gmusicapi/lib/gmusicapi/protocol.py
@@ -266,6 +266,11 @@ class Metadata_Expectations(object):
val_type = "boolean"
class matchedId(_Metadata_Expectation):
mutable = False
+
+ #Seems to be a matching track in the store.
+ class storeId(_Metadata_Expectation):
+ mutable = False
+ optional = True
#Dependent metadata:
@@ -310,6 +315,7 @@ class Metadata_Expectations(object):
mutable = False
volatile = True
val_type = "integer"
+ optional = True #only appears if song has been played
class WC_Protocol(object):
@@ -553,7 +559,6 @@ class WC_Protocol(object):
req = {}
res = {"type":"object",
"properties":{
- "magicPlaylists": WC_Protocol.pl_array,
"playlists": WC_Protocol.pl_array,
},
"additionalProperties":False
@@ -607,7 +612,7 @@ class WC_Protocol(object):
res = {"type":"object",
"properties":{
"downloadCounts":{
- "type":"array",
+ "type":"object",
"items":{
"type":"object",
"properties":{
@@ -748,7 +753,7 @@ class MM_Protocol(object):
for filename in filenames:
- if not filename.split(".")[-1] == "mp3":
+ if not filename.split(".")[-1].lower() == "mp3":
self.log.error("Cannot upload '%s' because it is not an mp3.")
track = metadata.tracks.add()
@@ -787,7 +792,13 @@ class MM_Protocol(object):
track.duration = int(audio.info.length * 1000)
#GM requires at least a title.
- track.title = audio["title"][0] if "title" in audio else
filename.split(r'/')[-1]
+ if "title" in audio:
+ track.title = audio["title"][0]
+ else:
+ #attempt to handle unicode filenames.
+ enc = utils.guess_str_encoding(filename)[0]
+ track.title = filename.decode(enc).split(r'/')[-1]
+
if "album" in audio: track.album = audio["album"][0]
if "artist" in audio: track.artist = audio["artist"][0]
diff --git a/script.module.gmusicapi/lib/gmusicapi/utils/apilogging.py
b/script.module.gmusicapi/lib/gmusicapi/utils/apilogging.py
index 3f038a2..b2a5cc2 100644
--- a/script.module.gmusicapi/lib/gmusicapi/utils/apilogging.py
+++ b/script.module.gmusicapi/lib/gmusicapi/utils/apilogging.py
@@ -31,7 +31,6 @@
import logging
root_logger_name = "gmusicapi"
-log_filename = "gmusicapi.log"
#Logging code adapted from:
# http://docs.python.org/howto/logging-cookbook.html#logging-cookbook
@@ -43,20 +42,14 @@ class LogController(object):
logger = logging.getLogger(root_logger_name)
logger.setLevel(logging.DEBUG)
- # create file handler to log debug info
- fh = logging.FileHandler(log_filename)
- fh.setLevel(logging.DEBUG)
-
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -
%(message)s')
- fh.setFormatter(formatter)
ch.setFormatter(formatter)
- logger.addHandler(fh)
logger.addHandler(ch)
logger.info("!-- Starting log --!")
diff --git a/script.module.gmusicapi/lib/gmusicapi/utils/utils.py
b/script.module.gmusicapi/lib/gmusicapi/utils/utils.py
index 1ef4dce..be377d5 100644
--- a/script.module.gmusicapi/lib/gmusicapi/utils/utils.py
+++ b/script.module.gmusicapi/lib/gmusicapi/utils/utils.py
@@ -34,10 +34,21 @@ from htmlentitydefs import name2codepoint
import mutagen
from decorator import decorator
+import chardet
from apilogging import LogController
log = LogController.get_logger("utils")
+def guess_str_encoding(s):
+ """Return a tuple (guessed encoding, confidence)."""
+
+ res = chardet.detect(s)
+ return (res['encoding'], res['confidence'])
+
+def guess_file_encoding(filename):
+ with open(filename) as f:
+ return guess_str_encoding(f.read())
+
def copy_md_tags(from_fname, to_fname):
"""Copy all metadata from *from_fname* to *to_fname* and write.
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=ea64953b4f32c8a32d0bba3578e5b2c2e1e2aa54
commit ea64953b4f32c8a32d0bba3578e5b2c2e1e2aa54
Author: Martijn Kaijser <[email protected]>
Date: Thu Dec 20 21:30:31 2012 +0100
[script.module.xbmcswift2] -1.3.1
diff --git a/script.module.xbmcswift2/addon.xml
b/script.module.xbmcswift2/addon.xml
index 23dfa1f..705a758 100644
--- a/script.module.xbmcswift2/addon.xml
+++ b/script.module.xbmcswift2/addon.xml
@@ -1,4 +1,4 @@
-<addon id="script.module.xbmcswift2" name="xbmcswift2" provider-name="Jonathan
Beluch (jbel)" version="1.3.0">
+<addon id="script.module.xbmcswift2" name="xbmcswift2" provider-name="Jonathan
Beluch (jbel)" version="1.3.1">
<requires>
<import addon="xbmc.python" version="2.0" />
</requires>
@@ -6,4 +6,4 @@
<extension point="xbmc.addon.metadata">
<platform>all</platform>
</extension>
-</addon>
+</addon>
\ No newline at end of file
diff --git a/script.module.xbmcswift2/changelog.txt
b/script.module.xbmcswift2/changelog.txt
index c551282..9eb058c 100644
--- a/script.module.xbmcswift2/changelog.txt
+++ b/script.module.xbmcswift2/changelog.txt
@@ -1,6 +1,12 @@
CHANGES
=======
+Version 1.3.1
+-------------
+
+- Bug fixes
+
+
Version 1.3
-----------
diff --git a/script.module.xbmcswift2/lib/xbmcswift2/logger.py
b/script.module.xbmcswift2/lib/xbmcswift2/logger.py
index d7341f2..ba4f186 100644
--- a/script.module.xbmcswift2/lib/xbmcswift2/logger.py
+++ b/script.module.xbmcswift2/lib/xbmcswift2/logger.py
@@ -67,7 +67,7 @@ class XBMCFilter(object):
from xbmcswift2 import xbmc
xbmc_level = XBMCFilter.xbmc_levels.get(
XBMCFilter.python_to_xbmc.get(record.levelname))
- xbmc.log('%s%s' % (self.prefix, record.msg), xbmc_level)
+ xbmc.log('%s%s' % (self.prefix, record.getMessage()), xbmc_level)
return False
diff --git a/script.module.xbmcswift2/lib/xbmcswift2/plugin.py
b/script.module.xbmcswift2/lib/xbmcswift2/plugin.py
index a88994a..6e821dc 100644
--- a/script.module.xbmcswift2/lib/xbmcswift2/plugin.py
+++ b/script.module.xbmcswift2/lib/xbmcswift2/plugin.py
@@ -300,6 +300,7 @@ class Plugin(XBMCMixin):
# Allow the returning of bare dictionaries so we can cache view
if not self._end_of_directory and self.handle == 0:
listitems = self.finish(listitems)
+
return listitems
raise NotFoundException, 'No matching view found for %s' % path
@@ -315,4 +316,13 @@ class Plugin(XBMCMixin):
'''The main entry point for a plugin.'''
self._request = self._parse_request()
log.debug('Handling incoming request for %s', self.request.path)
- return self._dispatch(self.request.path)
+ items = self._dispatch(self.request.path)
+
+ # Close any open storages which will persist them to disk
+ if hasattr(self, '_unsynced_storages'):
+ for storage in self._unsynced_storages.values():
+ log.debug('Saving a %s storage to disk at "%s"',
+ storage.file_format, storage.filename)
+ storage.close()
+
+ return items
diff --git a/script.module.xbmcswift2/lib/xbmcswift2/xbmcmixin.py
b/script.module.xbmcswift2/lib/xbmcswift2/xbmcmixin.py
index 781e6f0..9af96f6 100644
--- a/script.module.xbmcswift2/lib/xbmcswift2/xbmcmixin.py
+++ b/script.module.xbmcswift2/lib/xbmcswift2/xbmcmixin.py
@@ -372,12 +372,5 @@ class XBMCMixin(object):
# Finalize the directory items
self.end_of_directory(succeeded, update_listing, cache_to_disc)
- # Close any open storages which will persist them to disk
- if hasattr(self, '_unsynced_storages'):
- for storage in self._unsynced_storages.values():
- log.debug('Saving a %s storage to disk at "%s"',
- storage.file_format, storage.filename)
- storage.close()
-
# Return the cached list of all the list items that were added
return self.added_items
diff --git a/script.module.xbmcswift2/xbmcswift2_version
b/script.module.xbmcswift2/xbmcswift2_version
index e793f49..7f32932 100644
--- a/script.module.xbmcswift2/xbmcswift2_version
+++ b/script.module.xbmcswift2/xbmcswift2_version
@@ -1 +1 @@
-5807a56a648fba3917ada0f96d53efa9010388ce
\ No newline at end of file
+e92ddbf59eaccf7fc6ea86e80798e420ffc4fb0d
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
script.module.gmusicapi/addon.xml | 7 ++++---
script.module.gmusicapi/changelog.txt | 3 +++
script.module.gmusicapi/lib/gmusicapi/api.py | 12 ++++--------
script.module.gmusicapi/lib/gmusicapi/protocol.py | 19 +++++++++++++++----
.../lib/gmusicapi/utils/apilogging.py | 7 -------
.../lib/gmusicapi/utils/utils.py | 11 +++++++++++
script.module.xbmcswift2/addon.xml | 4 ++--
script.module.xbmcswift2/changelog.txt | 6 ++++++
script.module.xbmcswift2/lib/xbmcswift2/logger.py | 2 +-
script.module.xbmcswift2/lib/xbmcswift2/plugin.py | 12 +++++++++++-
.../lib/xbmcswift2/xbmcmixin.py | 7 -------
script.module.xbmcswift2/xbmcswift2_version | 2 +-
12 files changed, 58 insertions(+), 34 deletions(-)
hooks/post-receive
--
Scripts
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons