From 20b060284210de0d9ad13b3e2b1b87e12d3a8814 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 6 Nov 2013 16:17:47 +0100 Subject: [PATCH] audio/scanner: Move translator into audio. Tries to move more of the gst bits and pieces we are leaking into audio. --- mopidy/audio/scan.py | 51 +++++++++++++++ mopidy/scanner.py | 63 ++----------------- tests/{scanner_test.py => audio/scan_test.py} | 7 +-- 3 files changed, 58 insertions(+), 63 deletions(-) rename tests/{scanner_test.py => audio/scan_test.py} (97%) diff --git a/mopidy/audio/scan.py b/mopidy/audio/scan.py index 4540bc05..f12b8ff6 100644 --- a/mopidy/audio/scan.py +++ b/mopidy/audio/scan.py @@ -5,9 +5,11 @@ pygst.require('0.10') import gst import gobject +import datetime import time from mopidy import exceptions +from mopidy.models import Track, Artist, Album class Scanner(object): @@ -90,3 +92,52 @@ class Scanner(object): return duration // gst.MSECOND except gst.QueryError: return None + + +def audio_data_to_track(data): + """Convert taglist data + our extras to a track.""" + albumartist_kwargs = {} + album_kwargs = {} + artist_kwargs = {} + track_kwargs = {} + + def _retrieve(source_key, target_key, target): + if source_key in data: + target[target_key] = data[source_key] + + _retrieve(gst.TAG_ALBUM, 'name', album_kwargs) + _retrieve(gst.TAG_TRACK_COUNT, 'num_tracks', album_kwargs) + _retrieve(gst.TAG_ALBUM_VOLUME_COUNT, 'num_discs', album_kwargs) + _retrieve(gst.TAG_ARTIST, 'name', artist_kwargs) + + if gst.TAG_DATE in data and data[gst.TAG_DATE]: + date = data[gst.TAG_DATE] + try: + date = datetime.date(date.year, date.month, date.day) + except ValueError: + pass # Ignore invalid dates + else: + track_kwargs['date'] = date.isoformat() + + _retrieve(gst.TAG_TITLE, 'name', track_kwargs) + _retrieve(gst.TAG_TRACK_NUMBER, 'track_no', track_kwargs) + _retrieve(gst.TAG_ALBUM_VOLUME_NUMBER, 'disc_no', track_kwargs) + + # Following keys don't seem to have TAG_* constant. + _retrieve('album-artist', 'name', albumartist_kwargs) + _retrieve('musicbrainz-trackid', 'musicbrainz_id', track_kwargs) + _retrieve('musicbrainz-artistid', 'musicbrainz_id', artist_kwargs) + _retrieve('musicbrainz-albumid', 'musicbrainz_id', album_kwargs) + _retrieve( + 'musicbrainz-albumartistid', 'musicbrainz_id', albumartist_kwargs) + + if albumartist_kwargs: + album_kwargs['artists'] = [Artist(**albumartist_kwargs)] + + track_kwargs['uri'] = data['uri'] + track_kwargs['last_modified'] = int(data['mtime']) + track_kwargs['length'] = data[gst.TAG_DURATION] + track_kwargs['album'] = Album(**album_kwargs) + track_kwargs['artists'] = [Artist(**artist_kwargs)] + + return Track(**track_kwargs) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 4430ea31..02b04cb8 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals import argparse -import datetime import logging import os import sys @@ -10,20 +9,13 @@ import time import gobject gobject.threads_init() - # Extract any command line arguments. This needs to be done before GStreamer is # imported, so that GStreamer doesn't hijack e.g. ``--help``. mopidy_args = sys.argv[1:] sys.argv[1:] = [] - -import pygst -pygst.require('0.10') -import gst - from mopidy import config as config_lib, exceptions, ext from mopidy.audio import scan -from mopidy.models import Track, Artist, Album from mopidy.utils import log, path, versioning @@ -81,11 +73,13 @@ 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)) if int(stat.st_mtime) > track.last_modified: uris_update.add(track.uri) uris_library.add(track.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)) @@ -111,8 +105,8 @@ def main(): try: data = scanner.scan(uri) data[b'mtime'] = os.path.getmtime(path.uri_to_path(uri)) - # TODO: check minumum time - track = translator(data) + # TODO: check minumum time here instead of in scanner. + track = scan.audio_data_to_track(data) local_updater.add(track) logging.debug('Added %s', track.uri) except exceptions.ScannerError as error: @@ -155,54 +149,5 @@ def parse_args(): return parser.parse_args(args=mopidy_args) -# TODO: move into scanner. -def translator(data): - albumartist_kwargs = {} - album_kwargs = {} - artist_kwargs = {} - track_kwargs = {} - - def _retrieve(source_key, target_key, target): - if source_key in data: - target[target_key] = data[source_key] - - _retrieve(gst.TAG_ALBUM, 'name', album_kwargs) - _retrieve(gst.TAG_TRACK_COUNT, 'num_tracks', album_kwargs) - _retrieve(gst.TAG_ALBUM_VOLUME_COUNT, 'num_discs', album_kwargs) - _retrieve(gst.TAG_ARTIST, 'name', artist_kwargs) - - if gst.TAG_DATE in data and data[gst.TAG_DATE]: - date = data[gst.TAG_DATE] - try: - date = datetime.date(date.year, date.month, date.day) - except ValueError: - pass # Ignore invalid dates - else: - track_kwargs['date'] = date.isoformat() - - _retrieve(gst.TAG_TITLE, 'name', track_kwargs) - _retrieve(gst.TAG_TRACK_NUMBER, 'track_no', track_kwargs) - _retrieve(gst.TAG_ALBUM_VOLUME_NUMBER, 'disc_no', track_kwargs) - - # Following keys don't seem to have TAG_* constant. - _retrieve('album-artist', 'name', albumartist_kwargs) - _retrieve('musicbrainz-trackid', 'musicbrainz_id', track_kwargs) - _retrieve('musicbrainz-artistid', 'musicbrainz_id', artist_kwargs) - _retrieve('musicbrainz-albumid', 'musicbrainz_id', album_kwargs) - _retrieve( - 'musicbrainz-albumartistid', 'musicbrainz_id', albumartist_kwargs) - - if albumartist_kwargs: - album_kwargs['artists'] = [Artist(**albumartist_kwargs)] - - track_kwargs['uri'] = data['uri'] - track_kwargs['last_modified'] = int(data['mtime']) - track_kwargs['length'] = data[gst.TAG_DURATION] - track_kwargs['album'] = Album(**album_kwargs) - track_kwargs['artists'] = [Artist(**artist_kwargs)] - - return Track(**track_kwargs) - - if __name__ == '__main__': main() diff --git a/tests/scanner_test.py b/tests/audio/scan_test.py similarity index 97% rename from tests/scanner_test.py rename to tests/audio/scan_test.py index 47cc8116..eb92635f 100644 --- a/tests/scanner_test.py +++ b/tests/audio/scan_test.py @@ -3,9 +3,8 @@ from __future__ import unicode_literals import unittest from mopidy import exceptions -from mopidy.audio.scan import Scanner +from mopidy.audio import scan from mopidy.models import Track, Artist, Album -from mopidy.scanner import translator from mopidy.utils import path as path_lib from tests import path_to_data_dir @@ -77,7 +76,7 @@ class TranslatorTest(unittest.TestCase): def check(self): expected = self.build_track() - actual = translator(self.data) + actual = scan.audio_data_to_track(self.data) self.assertEqual(expected, actual) def test_basic_data(self): @@ -152,7 +151,7 @@ class ScannerTest(unittest.TestCase): def scan(self, path): paths = path_lib.find_files(path_to_data_dir(path)) uris = (path_lib.path_to_uri(p) for p in paths) - scanner = Scanner() + scanner = scan.Scanner() for uri in uris: key = uri[len('file://'):] try: