audio: Switch to using converted taglists instead of raw data.
This commit is contained in:
parent
f477e9176e
commit
671ee5ee6a
@ -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
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user