From f8dedc0b848a7fdce6caf360279b5a450729dcc1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 6 Nov 2013 21:46:41 +0100 Subject: [PATCH 1/4] local: Add local_to_file_uri translator --- mopidy/backends/local/playback.py | 8 ++++---- mopidy/backends/local/translator.py | 9 ++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mopidy/backends/local/playback.py b/mopidy/backends/local/playback.py index 98c92a85..9fbb736d 100644 --- a/mopidy/backends/local/playback.py +++ b/mopidy/backends/local/playback.py @@ -6,14 +6,14 @@ import os from mopidy.backends import base from mopidy.utils import path +from . import translator + 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 From e7dd7e26773f493a5bf1dd6355fb05078dbb3c37 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 7 Nov 2013 00:03:00 +0100 Subject: [PATCH 2/4] local/scanner: Make checking mtime and skipping known files work again This change just patches over the worst of the inconsistencies in how the scanner mixes local and file uris to get us to a working state again. Ideally, this still needs a real cleanup when we finish the plugable library providers and/or json library work. --- mopidy/backends/local/library.py | 7 +++++-- mopidy/scanner.py | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) 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/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)) From 93918cb1e059b7ce73e7be54414fcb53b9f3ced3 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 7 Nov 2013 23:25:55 +0100 Subject: [PATCH 3/4] local: flake8 fixes --- mopidy/backends/local/playback.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mopidy/backends/local/playback.py b/mopidy/backends/local/playback.py index 9fbb736d..b264dac7 100644 --- a/mopidy/backends/local/playback.py +++ b/mopidy/backends/local/playback.py @@ -1,10 +1,8 @@ from __future__ import unicode_literals import logging -import os from mopidy.backends import base -from mopidy.utils import path from . import translator From 51d1e2265515b5ef0a0d35c22c15417c04197ee9 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 8 Nov 2013 23:51:45 +0100 Subject: [PATCH 4/4] docs: Update changelog for PR #566 and #567 --- docs/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 44ca89f7..f9ccbb3e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -18,6 +18,10 @@ v0.17.0 (UNRELEASED) - When scanning, we no longer default the album artist to be the same as the track artist. Album artist is now only populated if the scanned file got an explicit album artist set. +- Library scanning has been switched back to custom code due to various issues + with GStreamer's built in scanner in 0.10. This also fixes the scanner slowdown. + (Fixes: :issue:`565`) +- Fix scanner so that mtime is respected when deciding which files can be skipped. v0.16.1 (2013-11-02)