local: Make ordering of json browse stable

This commit is contained in:
Thomas Adamcik 2014-01-14 00:46:07 +01:00
parent 1b32b56cf0
commit d95b07f737

View File

@ -1,5 +1,6 @@
from __future__ import absolute_import, unicode_literals
import collections
import gzip
import json
import logging
@ -53,7 +54,7 @@ class _BrowseCache(object):
'baz': {},
None: [ref3]}}
"""
self._root = {}
self._root = collections.OrderedDict()
for uri in uris:
path = translator.local_track_uri_to_path(uri, b'/')
@ -61,9 +62,9 @@ class _BrowseCache(object):
filename = parts.pop()
node = self._root
for part in parts:
node = node.setdefault(part, {})
node = node.setdefault(part, collections.OrderedDict())
ref = models.Ref.track(uri=uri, name=filename)
node.setdefault(None, set()).add(ref)
node.setdefault(None, []).append(ref)
def split(self, path):
return re.findall(r'([^/]+)', path)
@ -76,12 +77,13 @@ class _BrowseCache(object):
node = node.get(part, {})
for key, value in node.items():
if key is None:
results.extend(value)
else:
if key is not None:
uri = os.path.join(path, key)
results.append(models.Ref.directory(uri=uri, name=key))
# Get tracks afterwards to ensure ordering.
results.extend(node.get(None, []))
return results
@ -104,7 +106,7 @@ class JsonLibrary(local.Library):
logger.debug('Loading json library from %s', self._json_file)
library = load_library(self._json_file)
self._tracks = dict((t.uri, t) for t in library.get('tracks', []))
self._browse_cache = _BrowseCache(self._tracks.keys())
self._browse_cache = _BrowseCache(sorted(self._tracks))
return len(self._tracks)
def lookup(self, uri):