From 50467fef78b83ed780224de1fb40fb20ae18206a Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 20 Jun 2014 22:10:22 +0200 Subject: [PATCH] stream: Allow for blacklisting of metadata lookups against URI patterns. --- docs/ext/stream.rst | 7 +++++++ mopidy/stream/__init__.py | 1 + mopidy/stream/actor.py | 15 ++++++++++++--- mopidy/stream/ext.conf | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/ext/stream.rst b/docs/ext/stream.rst index 88dc5ade..b0b92fbd 100644 --- a/docs/ext/stream.rst +++ b/docs/ext/stream.rst @@ -42,3 +42,10 @@ See :ref:`config` for general help on configuring Mopidy. .. confval:: stream/timeout Number of milliseconds before giving up looking up stream metadata. + +.. confval:: stream/metadata_blacklist + + List of URI globs to not fetch metadata from before playing. This feature + is typically needed for play once URIs provided by certain streaming + providers. Regular POSIX glob semantics apply, so ``http://*.example.com/*`` + would match all example.com sub-domains. diff --git a/mopidy/stream/__init__.py b/mopidy/stream/__init__.py index e4c2bad7..08e1a0b7 100644 --- a/mopidy/stream/__init__.py +++ b/mopidy/stream/__init__.py @@ -19,6 +19,7 @@ class Extension(ext.Extension): def get_config_schema(self): schema = super(Extension, self).get_config_schema() schema['protocols'] = config.List() + schema['metadata_blacklist'] = config.List() schema['timeout'] = config.Integer( minimum=1000, maximum=1000 * 60 * 60) return schema diff --git a/mopidy/stream/actor.py b/mopidy/stream/actor.py index aecc4e42..b17dfcea 100644 --- a/mopidy/stream/actor.py +++ b/mopidy/stream/actor.py @@ -1,6 +1,8 @@ from __future__ import unicode_literals +import fnmatch import logging +import re import urlparse import pykka @@ -17,7 +19,8 @@ class StreamBackend(pykka.ThreadingActor, backend.Backend): super(StreamBackend, self).__init__() self.library = StreamLibraryProvider( - backend=self, timeout=config['stream']['timeout']) + backend=self, timeout=config['stream']['timeout'], + blacklist=config['stream']['metadata_blacklist']) self.playback = backend.PlaybackProvider(audio=audio, backend=self) self.playlists = None @@ -26,19 +29,25 @@ class StreamBackend(pykka.ThreadingActor, backend.Backend): class StreamLibraryProvider(backend.LibraryProvider): - def __init__(self, backend, timeout): + def __init__(self, backend, timeout, blacklist): super(StreamLibraryProvider, self).__init__(backend) self._scanner = scan.Scanner(min_duration=None, timeout=timeout) + self._blacklist_re = re.compile( + r'^(%s)$' % '|'.join(fnmatch.translate(u) for u in blacklist)) def lookup(self, uri): if urlparse.urlsplit(uri).scheme not in self.backend.uri_schemes: return [] + if self._blacklist_re.match(uri): + logger.debug('URI matched metadata lookup blacklist: %s', uri) + return [Track(uri=uri)] + try: data = self._scanner.scan(uri) track = scan.audio_data_to_track(data) except exceptions.ScannerError as e: logger.warning('Problem looking up %s: %s', uri, e) - track = Track(uri=uri, name=uri) + track = Track(uri=uri) return [track] diff --git a/mopidy/stream/ext.conf b/mopidy/stream/ext.conf index 811dec88..cedb3085 100644 --- a/mopidy/stream/ext.conf +++ b/mopidy/stream/ext.conf @@ -9,3 +9,4 @@ protocols = rtmps rtsp timeout = 5000 +metadata_blacklist =