diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 86d960c1..9791c518 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -8,7 +8,7 @@ from mopidy.backends import base from mopidy.frontends.mpd import translator as mpd_translator from mopidy.models import Album, SearchResult -from .translator import parse_mpd_tag_cache +from .translator import local_to_file_uri, parse_mpd_tag_cache logger = logging.getLogger('mopidy.backends.local') @@ -189,7 +189,10 @@ class LocalLibraryUpdateProvider(base.BaseLibraryProvider): def load(self): tracks = parse_mpd_tag_cache(self._tag_cache_file, self._media_dir) for track in tracks: - self._tracks[track.uri] = track + # TODO: this should use uris as is, i.e. hack that should go away + # with tag caches. + uri = local_to_file_uri(track.uri, self._media_dir) + self._tracks[uri] = track.copy(uri=uri) return tracks def add(self, track): diff --git a/mopidy/backends/local/playback.py b/mopidy/backends/local/playback.py index 98c92a85..b264dac7 100644 --- a/mopidy/backends/local/playback.py +++ b/mopidy/backends/local/playback.py @@ -1,10 +1,10 @@ from __future__ import unicode_literals import logging -import os from mopidy.backends import base -from mopidy.utils import path + +from . import translator logger = logging.getLogger('mopidy.backends.local') @@ -12,8 +12,6 @@ logger = logging.getLogger('mopidy.backends.local') class LocalPlaybackProvider(base.BasePlaybackProvider): def change_track(self, track): media_dir = self.backend.config['local']['media_dir'] - # TODO: check that type is correct. - file_path = path.uri_to_path(track.uri).split(b':', 1)[1] - file_path = os.path.join(media_dir, file_path) - track = track.copy(uri=path.path_to_uri(file_path)) + uri = translator.local_to_file_uri(track.uri, media_dir) + track = track.copy(uri=uri) return super(LocalPlaybackProvider, self).change_track(track) diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index 3a02a8af..3c6b8151 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -6,11 +6,18 @@ import urlparse from mopidy.models import Track, Artist, Album from mopidy.utils.encoding import locale_decode -from mopidy.utils.path import path_to_uri +from mopidy.utils.path import path_to_uri, uri_to_path logger = logging.getLogger('mopidy.backends.local') +def local_to_file_uri(uri, media_dir): + # TODO: check that type is correct. + file_path = uri_to_path(uri).split(b':', 1)[1] + file_path = os.path.join(media_dir, file_path) + return path_to_uri(file_path) + + def parse_m3u(file_path, media_dir): r""" Convert M3U file list of uris diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 30fb553b..b61517ef 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -16,6 +16,7 @@ sys.argv[1:] = [] from mopidy import config as config_lib, exceptions, ext from mopidy.audio import scan +from mopidy.backends.local import translator from mopidy.utils import log, path, versioning @@ -66,6 +67,8 @@ def main(): media_dir = config['local']['media_dir'] excluded_extensions = config['local']['excluded_file_extensions'] + # TODO: cleanup to consistently use local urls, not a random mix of local + # and file uris depending on how the data was loaded. uris_library = set() uris_update = set() uris_remove = set() @@ -73,20 +76,20 @@ def main(): logging.info('Checking tracks from library.') for track in local_updater.load(): try: - # TODO: convert local to file uri / path - stat = os.stat(path.uri_to_path(track.uri)) + uri = translator.local_to_file_uri(track.uri, media_dir) + stat = os.stat(path.uri_to_path(uri)) if int(stat.st_mtime) > track.last_modified: - uris_update.add(track.uri) - uris_library.add(track.uri) + uris_update.add(uri) + uris_library.add(uri) except OSError: logging.debug('Missing file %s', track.uri) uris_remove.add(track.uri) - logging.info('Removing %d moved or deleted tracks.', len(uris_remove)) + logging.info('Removing %d missing tracks.', len(uris_remove)) for uri in uris_remove: local_updater.remove(uri) - logging.info('Checking %s for new or modified tracks.', media_dir) + logging.info('Checking %s for unknown tracks.', media_dir) for uri in path.find_uris(config['local']['media_dir']): if os.path.splitext(path.uri_to_path(uri))[1] in excluded_extensions: logging.debug('Skipped %s: File extension excluded.', uri) @@ -95,8 +98,8 @@ def main(): if uri not in uris_library: uris_update.add(uri) - logging.info('Found %d new or modified tracks.', len(uris_update)) - logging.info('Scanning new and modified tracks.') + logging.info('Found %d unknown tracks.', len(uris_update)) + logging.info('Scanning...') scanner = scan.Scanner(config['local']['scan_timeout']) progress = Progress(len(uris_update))