From acad477c8a2debe60f6bddd40cd37ac2277ea3cc Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 2 Jun 2011 18:41:43 +0200 Subject: [PATCH 01/12] Make it possible to stop scanner more cleanly --- bin/mopidy-scan | 5 ++++- mopidy/scanner.py | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bin/mopidy-scan b/bin/mopidy-scan index 84cfee57..718deb73 100755 --- a/bin/mopidy-scan +++ b/bin/mopidy-scan @@ -20,7 +20,10 @@ if __name__ == '__main__': print >> sys.stderr, 'Scanning %s' % settings.LOCAL_MUSIC_PATH scanner = Scanner(settings.LOCAL_MUSIC_PATH, store, debug) - scanner.start() + try: + scanner.start() + except KeyboardInterrupt: + scanner.stop() print >> sys.stderr, 'Done' diff --git a/mopidy/scanner.py b/mopidy/scanner.py index c603c578..b9c770de 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -82,8 +82,11 @@ class Scanner(object): data = dict([(k, data[k]) for k in data.keys()]) data['uri'] = unicode(self.uribin.get_property('uri')) data['duration'] = self.get_duration() - self.data_callback(data) - self.next_uri() + try: + self.data_callback(data) + self.next_uri() + except KeyboardInterrupt: + self.stop() def process_error(self, bus, message): if self.error_callback: From b6c196b8abf7d25ed3bd1a0b55afbff715ca48a0 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 00:13:40 +0200 Subject: [PATCH 02/12] Ensure that date is not none before using it --- mopidy/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index b9c770de..d3c61fc7 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -24,7 +24,7 @@ def translator(data): _retrieve(gst.TAG_TRACK_COUNT, 'num_tracks', album_kwargs) _retrieve(gst.TAG_ARTIST, 'name', artist_kwargs) - if gst.TAG_DATE in data: + if gst.TAG_DATE in data and data[gst.TAG_DATE]: date = data[gst.TAG_DATE] date = datetime.date(date.year, date.month, date.day) track_kwargs['date'] = date From 48d7cd986577081a1b951f4ead695f65fc08b650 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 00:14:04 +0200 Subject: [PATCH 03/12] Use TAG_DURATION constant instead of 'duration' --- mopidy/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index d3c61fc7..695cda27 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -81,7 +81,7 @@ class Scanner(object): data = message.parse_tag() data = dict([(k, data[k]) for k in data.keys()]) data['uri'] = unicode(self.uribin.get_property('uri')) - data['duration'] = self.get_duration() + data[gst.TAG_DURATION] = self.get_duration() try: self.data_callback(data) self.next_uri() From e25fbb35dc47bdfbbf8d610c61e2a0cc61fdd3c1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 00:14:17 +0200 Subject: [PATCH 04/12] Note why get_state is needed --- mopidy/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 695cda27..c3eda9ae 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -96,7 +96,7 @@ class Scanner(object): self.next_uri() def get_duration(self): - self.pipe.get_state() + self.pipe.get_state() # Block untill state change is done. try: return self.pipe.query_duration( gst.FORMAT_TIME, None)[0] // gst.MSECOND From ea8b4fc2b0fa0f8044bca28925adc8145ef1e5f9 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 00:17:27 +0200 Subject: [PATCH 05/12] Remove if __name__ = '__main__' as it was redundant in mopidy-scanner --- bin/mopidy-scan | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/bin/mopidy-scan b/bin/mopidy-scan index 718deb73..962c402a 100755 --- a/bin/mopidy-scan +++ b/bin/mopidy-scan @@ -1,34 +1,33 @@ #!/usr/bin/env python -if __name__ == '__main__': - import sys +import sys - from mopidy import settings - from mopidy.scanner import Scanner, translator - from mopidy.frontends.mpd.translator import tracks_to_tag_cache_format +from mopidy import settings +from mopidy.scanner import Scanner, translator +from mopidy.frontends.mpd.translator import tracks_to_tag_cache_format - tracks = [] +tracks = [] - def store(data): - track = translator(data) - tracks.append(track) - print >> sys.stderr, 'Added %s' % track.uri +def store(data): + track = translator(data) + tracks.append(track) + print >> sys.stderr, 'Added %s' % track.uri - def debug(uri, error): - print >> sys.stderr, 'Failed %s: %s' % (uri, error) +def debug(uri, error): + print >> sys.stderr, 'Failed %s: %s' % (uri, error) - print >> sys.stderr, 'Scanning %s' % settings.LOCAL_MUSIC_PATH +print >> sys.stderr, 'Scanning %s' % settings.LOCAL_MUSIC_PATH - scanner = Scanner(settings.LOCAL_MUSIC_PATH, store, debug) - try: - scanner.start() - except KeyboardInterrupt: - scanner.stop() +scanner = Scanner(settings.LOCAL_MUSIC_PATH, store, debug) +try: + scanner.start() +except KeyboardInterrupt: + scanner.stop() - print >> sys.stderr, 'Done' +print >> sys.stderr, 'Done' - for a in tracks_to_tag_cache_format(tracks): - if len(a) == 1: - print (u'%s' % a).encode('utf-8') - else: - print (u'%s: %s' % a).encode('utf-8') +for a in tracks_to_tag_cache_format(tracks): + if len(a) == 1: + print (u'%s' % a).encode('utf-8') + else: + print (u'%s: %s' % a).encode('utf-8') From 710f434455ffab01d665d97d6fa0a0e7e5592c16 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 00:32:55 +0200 Subject: [PATCH 06/12] Switch to proper logging for mopidy scanner --- bin/mopidy-scan | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/bin/mopidy-scan b/bin/mopidy-scan index 962c402a..b87e8eb9 100755 --- a/bin/mopidy-scan +++ b/bin/mopidy-scan @@ -1,22 +1,26 @@ #!/usr/bin/env python import sys +import logging from mopidy import settings +from mopidy.utils.log import setup_console_logging from mopidy.scanner import Scanner, translator from mopidy.frontends.mpd.translator import tracks_to_tag_cache_format +setup_console_logging(2) + tracks = [] def store(data): track = translator(data) tracks.append(track) - print >> sys.stderr, 'Added %s' % track.uri + logging.debug('Added %s', track.uri) def debug(uri, error): - print >> sys.stderr, 'Failed %s: %s' % (uri, error) + logging.error('Failed %s: %s', uri, error) -print >> sys.stderr, 'Scanning %s' % settings.LOCAL_MUSIC_PATH +logging.info('Scanning %s', settings.LOCAL_MUSIC_PATH) scanner = Scanner(settings.LOCAL_MUSIC_PATH, store, debug) try: @@ -24,7 +28,7 @@ try: except KeyboardInterrupt: scanner.stop() -print >> sys.stderr, 'Done' +logging.info('Done') for a in tracks_to_tag_cache_format(tracks): if len(a) == 1: From 503c98b98ee99196088d7e0f88dab7e7d5d98165 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 01:29:28 +0200 Subject: [PATCH 07/12] Cleanup of gst code for scanner --- mopidy/scanner.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index c3eda9ae..eade1ce5 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -57,17 +57,16 @@ class Scanner(object): self.error_callback = error_callback self.loop = gobject.MainLoop() - caps = gst.Caps('audio/x-raw-int') fakesink = gst.element_factory_make('fakesink') - pad = fakesink.get_pad('sink') self.uribin = gst.element_factory_make('uridecodebin') - self.uribin.connect('pad-added', self.process_new_pad, pad) - self.uribin.set_property('caps', caps) + self.uribin.set_property('caps', gst.Caps('audio/x-raw-int')) + self.uribin.connect('pad-added', self.process_new_pad, + fakesink.get_pad('sink')) self.pipe = gst.element_factory_make('pipeline') - self.pipe.add(fakesink) self.pipe.add(self.uribin) + self.pipe.add(fakesink) bus = self.pipe.get_bus() bus.add_signal_watch() From f091433a53c8b5ac3c27b4d35affb26daa673ee4 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 01:47:48 +0200 Subject: [PATCH 08/12] Cleanup error feedback --- bin/mopidy-scan | 10 +++++----- mopidy/scanner.py | 4 ++-- tests/scanner_test.py | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bin/mopidy-scan b/bin/mopidy-scan index b87e8eb9..b8b4fd3e 100755 --- a/bin/mopidy-scan +++ b/bin/mopidy-scan @@ -15,12 +15,12 @@ tracks = [] def store(data): track = translator(data) tracks.append(track) - logging.debug('Added %s', track.uri) + logging.debug(u'Added %s', track.uri) -def debug(uri, error): - logging.error('Failed %s: %s', uri, error) +def debug(uri, error, debug): + logging.error(u'Failed %s: %s - %s', uri, error, debug) -logging.info('Scanning %s', settings.LOCAL_MUSIC_PATH) +logging.info(u'Scanning %s', settings.LOCAL_MUSIC_PATH) scanner = Scanner(settings.LOCAL_MUSIC_PATH, store, debug) try: @@ -28,7 +28,7 @@ try: except KeyboardInterrupt: scanner.stop() -logging.info('Done') +logging.info(u'Done') for a in tracks_to_tag_cache_format(tracks): if len(a) == 1: diff --git a/mopidy/scanner.py b/mopidy/scanner.py index eade1ce5..17e8127d 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -90,8 +90,8 @@ class Scanner(object): def process_error(self, bus, message): if self.error_callback: uri = self.uribin.get_property('uri') - errors = message.parse_error() - self.error_callback(uri, errors) + error, debug = message.parse_error() + self.error_callback(uri, error, debug) self.next_uri() def get_duration(self): diff --git a/tests/scanner_test.py b/tests/scanner_test.py index b98c5aa9..b2f2f2fd 100644 --- a/tests/scanner_test.py +++ b/tests/scanner_test.py @@ -144,9 +144,9 @@ class ScannerTest(unittest.TestCase): uri = data['uri'][len('file://'):] self.data[uri] = data - def error_callback(self, uri, errors): + def error_callback(self, uri, error, debug): uri = uri[len('file://'):] - self.errors[uri] = errors + self.errors[uri] = (error, debug) def test_data_is_set(self): self.scan('scanner/simple') From 89104bd326587b84b8af5dd6151e836baa20ae22 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 01:52:11 +0200 Subject: [PATCH 09/12] Add skipped test case for date missing in scanner tests --- tests/scanner_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/scanner_test.py b/tests/scanner_test.py index b2f2f2fd..f403a221 100644 --- a/tests/scanner_test.py +++ b/tests/scanner_test.py @@ -4,7 +4,7 @@ from datetime import date from mopidy.scanner import Scanner, translator from mopidy.models import Track, Artist, Album -from tests import path_to_data_dir +from tests import path_to_data_dir, SkipTest class FakeGstDate(object): def __init__(self, year, month, day): @@ -184,3 +184,7 @@ class ScannerTest(unittest.TestCase): def test_other_media_is_ignored(self): self.scan('scanner/image') self.assert_(self.errors) + + @SkipTest + def test_song_without_time_is_handeled(self): + pass From eba5cff9d10170e0dca63368e5b3ae2236fb6360 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Jun 2011 02:21:42 +0200 Subject: [PATCH 10/12] Work around strange wma issue in scanner --- bin/mopidy-scan | 3 ++- mopidy/scanner.py | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/bin/mopidy-scan b/bin/mopidy-scan index b8b4fd3e..869aa662 100755 --- a/bin/mopidy-scan +++ b/bin/mopidy-scan @@ -4,10 +4,11 @@ import sys import logging from mopidy import settings -from mopidy.utils.log import setup_console_logging +from mopidy.utils.log import setup_console_logging, setup_root_logger from mopidy.scanner import Scanner, translator from mopidy.frontends.mpd.translator import tracks_to_tag_cache_format +setup_root_logger() setup_console_logging(2) tracks = [] diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 17e8127d..b2e254da 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -77,10 +77,21 @@ class Scanner(object): pad.link(target_pad) def process_tags(self, bus, message): - data = message.parse_tag() - data = dict([(k, data[k]) for k in data.keys()]) - data['uri'] = unicode(self.uribin.get_property('uri')) - data[gst.TAG_DURATION] = self.get_duration() + taglist = message.parse_tag() + data = { + 'uri': unicode(self.uribin.get_property('uri')), + gst.TAG_DURATION: self.get_duration(), + } + + for key in taglist.keys(): + # XXX: For some crazy reason some wma files spit out lists here, + # not sure if this is due to better data in headers or wma being + # stupid. So ugly hack for now :/ + if type(taglist[key]) is list: + data[key] = taglist[key][0] + else: + data[key] = taglist[key] + try: self.data_callback(data) self.next_uri() From b6d1ff2b7463c9fae38ca545b36b1c608074e4f3 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 9 Jun 2011 13:54:12 +0200 Subject: [PATCH 11/12] Add scanner improvements to changelog --- docs/changes.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index b4d56711..c1061a37 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -44,6 +44,17 @@ No description yet. authentication is turned on, but the connected user has not been authenticated yet. +- Tag cache generator: + + - Made it possible to CTRL^c mopidy-scan. + + - Fixed bug with bad dates. + + - Use logging not print statements. + + - Found and worked around strange WMA metadata behaviour, should be fixed + properly. + v0.4.1 (2011-05-06) =================== From 06bee1cd214fd959021ff40c0e0e30cf1bfc47e4 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 9 Jun 2011 13:55:15 +0200 Subject: [PATCH 12/12] Typo fix --- mopidy/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index b2e254da..3bcf03d9 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -106,7 +106,7 @@ class Scanner(object): self.next_uri() def get_duration(self): - self.pipe.get_state() # Block untill state change is done. + self.pipe.get_state() # Block until state change is done. try: return self.pipe.query_duration( gst.FORMAT_TIME, None)[0] // gst.MSECOND