File: Add feature to file module for sorting files vs directories.

Add configuration option in [file] section of mopidy.conf
Add documentation for feature with the valid options.

Signed-off-by: caysho@internode.on.net
This commit is contained in:
mopidy-dev 2017-01-23 21:24:39 +08:00
parent 2b7f12b854
commit 84992bf80e
4 changed files with 41 additions and 3 deletions

View File

@ -51,3 +51,16 @@ See :ref:`config` for general help on configuring Mopidy.
Number of milliseconds before giving up scanning a file and moving on to Number of milliseconds before giving up scanning a file and moving on to
the next file. Reducing the value might speed up the directory listing, the next file. Reducing the value might speed up the directory listing,
but can lead to some tracks not being shown. but can lead to some tracks not being shown.
.. confval:: file/sort_order
Sort the files and directories in the given order.
Options are:
``DirectoriesFirst``
``FilesFirst``
``Mixed``
Default is ``DirectoriesFirst``

View File

@ -26,6 +26,7 @@ class Extension(ext.Extension):
schema['show_dotfiles'] = config.Boolean(optional=True) schema['show_dotfiles'] = config.Boolean(optional=True)
schema['follow_symlinks'] = config.Boolean(optional=True) schema['follow_symlinks'] = config.Boolean(optional=True)
schema['metadata_timeout'] = config.Integer(optional=True) schema['metadata_timeout'] = config.Integer(optional=True)
schema['sort_order'] = config.String(optional=True)
return schema return schema
def setup(self, registry): def setup(self, registry):

View File

@ -9,3 +9,4 @@ excluded_file_extensions =
.jpeg .jpeg
follow_symlinks = false follow_symlinks = false
metadata_timeout = 1000 metadata_timeout = 1000
sort_order = DirectoriesFirst

View File

@ -43,9 +43,19 @@ class FileLibraryProvider(backend.LibraryProvider):
self._scanner = scan.Scanner( self._scanner = scan.Scanner(
timeout=config['file']['metadata_timeout']) timeout=config['file']['metadata_timeout'])
self._sort_order = config['file']['sort_order']
logger.info('File browing sort order is: %s', self._sort_order)
self._sort_files_first = (self._sort_order == 'FilesFirst')
self._sort_directories_first = (self._sort_order ==
'DirectoriesFirst')
self._sort_mixed = (self._sort_order == 'Mixed')
def browse(self, uri): def browse(self, uri):
logger.debug('Browsing files at: %s', uri) logger.debug('Browsing files at: %s', uri)
result = [] result = []
result_directories = []
result_files = []
local_path = path.uri_to_path(uri) local_path = path.uri_to_path(uri)
if local_path == 'root': if local_path == 'root':
@ -78,11 +88,24 @@ class FileLibraryProvider(backend.LibraryProvider):
name = dir_entry.decode(FS_ENCODING, 'replace') name = dir_entry.decode(FS_ENCODING, 'replace')
if os.path.isdir(child_path): if os.path.isdir(child_path):
result.append(models.Ref.directory(name=name, uri=uri)) result_directories.append(models.Ref.directory(name=name,
uri=uri))
elif os.path.isfile(child_path): elif os.path.isfile(child_path):
result.append(models.Ref.track(name=name, uri=uri)) result_files.append(models.Ref.track(name=name, uri=uri))
if not self._sort_mixed:
result_directories.sort(key=operator.attrgetter('name'))
result_files.sort(key=operator.attrgetter('name'))
if self._sort_mixed or self._sort_directories_first:
result = result_directories + result_files
if self._sort_files_first:
result = result_files + result_directories
if self._sort_mixed:
result.sort(key=operator.attrgetter('name'))
result.sort(key=operator.attrgetter('name'))
return result return result
def lookup(self, uri): def lookup(self, uri):