audio: Switch to using converted taglists instead of raw data.

This commit is contained in:
Thomas Adamcik 2014-12-14 22:25:52 +01:00
parent f477e9176e
commit 671ee5ee6a
2 changed files with 10 additions and 34 deletions

View File

@ -1,6 +1,5 @@
from __future__ import absolute_import, division, unicode_literals from __future__ import absolute_import, division, unicode_literals
import datetime
import os import os
import time import time
@ -9,6 +8,7 @@ pygst.require('0.10')
import gst # noqa import gst # noqa
from mopidy import exceptions from mopidy import exceptions
from mopidy.audio import utils
from mopidy.models import Album, Artist, Track from mopidy.models import Album, Artist, Track
from mopidy.utils import encoding, path from mopidy.utils import encoding, path
@ -98,16 +98,9 @@ class Scanner(object):
if message.src == self._pipe: if message.src == self._pipe:
return tags return tags
elif message.type == gst.MESSAGE_TAG: elif message.type == gst.MESSAGE_TAG:
# Taglists are not really dicts, hence the lack of .items() and
# explicit .keys. We only keep the last tag for each key, as we
# assume this is the best, some formats will produce multiple
# taglists. Lastly we force everything to lists for conformity.
taglist = message.parse_tag() taglist = message.parse_tag()
for key in taglist.keys(): # Note that this will only keep the last tag.
value = taglist[key] tags.update(utils.convert_taglist(taglist))
if not isinstance(value, list):
value = [value]
tags[key] = value
raise exceptions.ScannerError('Timeout after %dms' % self._timeout_ms) raise exceptions.ScannerError('Timeout after %dms' % self._timeout_ms)
@ -140,16 +133,7 @@ def _artists(tags, artist_name, artist_id=None):
return [Artist(name=name) for name in tags[artist_name]] return [Artist(name=name) for name in tags[artist_name]]
def _date(tags): # TODO: this doesn't belong in audio, if anything it should be moved to local.
if not tags.get(gst.TAG_DATE):
return None
try:
date = tags[gst.TAG_DATE][0]
return datetime.date(date.year, date.month, date.day).isoformat()
except ValueError:
return None
def add_musicbrainz_cover_art(track): def add_musicbrainz_cover_art(track):
if track.album and track.album.musicbrainz_id: if track.album and track.album.musicbrainz_id:
base = "http://coverartarchive.org/release" base = "http://coverartarchive.org/release"
@ -196,7 +180,9 @@ def audio_data_to_track(data):
album_kwargs['num_discs'] = tags.get(gst.TAG_ALBUM_VOLUME_COUNT, [None])[0] album_kwargs['num_discs'] = tags.get(gst.TAG_ALBUM_VOLUME_COUNT, [None])[0]
album_kwargs['musicbrainz_id'] = tags.get('musicbrainz-albumid', [None])[0] album_kwargs['musicbrainz_id'] = tags.get('musicbrainz-albumid', [None])[0]
track_kwargs['date'] = _date(tags) if tags.get(gst.TAG_DATE) and tags.get(gst.TAG_DATE)[0]:
track_kwargs['date'] = tags[gst.TAG_DATE][0].isoformat()
track_kwargs['last_modified'] = int(data.get('mtime') or 0) track_kwargs['last_modified'] = int(data.get('mtime') or 0)
track_kwargs['length'] = max( track_kwargs['length'] = max(
0, (data.get(gst.TAG_DURATION) or 0)) // gst.MSECOND 0, (data.get(gst.TAG_DURATION) or 0)) // gst.MSECOND

View File

@ -1,5 +1,6 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import datetime
import os import os
import unittest import unittest
@ -14,13 +15,6 @@ from mopidy.utils import path as path_lib
from tests import path_to_data_dir from tests import path_to_data_dir
class FakeGstDate(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
# TODO: keep ids without name? # TODO: keep ids without name?
class TranslatorTest(unittest.TestCase): class TranslatorTest(unittest.TestCase):
def setUp(self): def setUp(self):
@ -39,7 +33,7 @@ class TranslatorTest(unittest.TestCase):
'track-count': [2], 'track-count': [2],
'album-disc-number': [2], 'album-disc-number': [2],
'album-disc-count': [3], 'album-disc-count': [3],
'date': [FakeGstDate(2006, 1, 1,)], 'date': [datetime.date(2006, 1, 1,)],
'container-format': ['ID3 tag'], 'container-format': ['ID3 tag'],
'genre': ['genre'], 'genre': ['genre'],
'comment': ['comment'], 'comment': ['comment'],
@ -140,13 +134,9 @@ class TranslatorTest(unittest.TestCase):
self.check(self.track.copy(date=None)) self.check(self.track.copy(date=None))
def test_multiple_track_date(self): def test_multiple_track_date(self):
self.data['tags']['date'].append(FakeGstDate(2030, 1, 1)) self.data['tags']['date'].append(datetime.date(2030, 1, 1))
self.check(self.track) self.check(self.track)
def test_invalid_track_date(self):
self.data['tags']['date'] = [FakeGstDate(65535, 1, 1)]
self.check(self.track.copy(date=None))
def test_missing_track_comment(self): def test_missing_track_comment(self):
del self.data['tags']['comment'] del self.data['tags']['comment']
self.check(self.track.copy(comment=None)) self.check(self.track.copy(comment=None))