From 3259a11c8d5bf985b24dbe137900c6e757c20de3 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 21 Jun 2011 23:17:03 +0300 Subject: [PATCH] Test and implement mpris.Metadata property --- mopidy/frontends/mpris.py | 34 ++++++++-- .../frontends/mpris/player_interface_test.py | 67 ++++++++++++++++++- 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index 80c6eeb6..a2413a8d 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -142,10 +142,7 @@ class MprisObject(dbus.service.Object): 'LoopStatus': (self.get_LoopStatus, self.set_LoopStatus), 'Rate': (1.0, self.set_Rate), 'Shuffle': (self.get_Shuffle, self.set_Shuffle), - # TODO Get meta data - 'Metadata': ({ - 'mpris:trackid': '', # TODO Use (cpid, track.uri) - }, None), + 'Metadata': (self.get_Metadata, None), 'Volume': (self.get_Volume, self.set_Volume), 'Position': (self.get_Position, None), 'MinimumRate': (1.0, None), @@ -411,6 +408,35 @@ class MprisObject(dbus.service.Object): else: self.backend.playback.shuffle = False + def get_Metadata(self): + current_cp_track = self.backend.playback.current_cp_track.get() + if current_cp_track is None: + return {'mpris:trackid': ''} + else: + (cpid, track) = current_cp_track + metadata = {'mpris:trackid': '/com/mopidy/track/%d' % cpid} + if track.length: + metadata['mpris:length'] = track.length * 1000 + if track.uri: + metadata['xesam:url'] = track.uri + if track.name: + metadata['xesam:title'] = track.name + if track.artists: + artists = list(track.artists) + artists.sort(key=lambda a: a.name) + metadata['xesam:artist'] = dbus.Array( + [a.name for a in artists if a.name], signature='s') + if track.album and track.album.name: + metadata['xesam:album'] = track.album.name + if track.album and track.album.artists: + artists = list(track.album.artists) + artists.sort(key=lambda a: a.name) + metadata['xesam:albumArtist'] = dbus.Array( + [a.name for a in artists if a.name], signature='s') + if track.track_no: + metadata['xesam:trackNumber'] = track.track_no + return dbus.Dictionary(metadata, signature='sv') + def get_Volume(self): volume = self.mixer.volume.get() if volume is not None: diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index 42533870..b4cb5f70 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -5,7 +5,7 @@ from mopidy.backends.dummy import DummyBackend from mopidy.backends.base.playback import PlaybackController from mopidy.frontends import mpris from mopidy.mixers.dummy import DummyMixer -from mopidy.models import Track +from mopidy.models import Album, Artist, Track PLAYING = PlaybackController.PLAYING PAUSED = PlaybackController.PAUSED @@ -132,6 +132,71 @@ class PlayerInterfaceTest(unittest.TestCase): result = self.mpris.Set(mpris.PLAYER_IFACE, 'Shuffle', False) self.assertFalse(self.backend.playback.shuffle.get()) + def test_get_metadata_has_trackid_even_when_no_current_track(self): + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assert_('mpris:trackid' in result.keys()) + self.assertEquals(result['mpris:trackid'], '') + + def test_get_metadata_has_trackid_based_on_cpid(self): + self.backend.current_playlist.append([Track(uri='a')]) + self.backend.playback.play() + (cpid, track) = self.backend.playback.current_cp_track.get() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('mpris:trackid', result.keys()) + self.assertEquals(result['mpris:trackid'], + '/com/mopidy/track/%d' % cpid) + + def test_get_metadata_has_track_length(self): + self.backend.current_playlist.append([Track(uri='a', length=40000)]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('mpris:length', result.keys()) + self.assertEquals(result['mpris:length'], 40000000) + + def test_get_metadata_has_track_uri(self): + self.backend.current_playlist.append([Track(uri='a')]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:url', result.keys()) + self.assertEquals(result['xesam:url'], 'a') + + def test_get_metadata_has_track_title(self): + self.backend.current_playlist.append([Track(name='a')]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:title', result.keys()) + self.assertEquals(result['xesam:title'], 'a') + + def test_get_metadata_has_track_artists(self): + self.backend.current_playlist.append([Track(artists=[ + Artist(name='a'), Artist(name='b'), Artist(name=None)])]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:artist', result.keys()) + self.assertEquals(result['xesam:artist'], ['a', 'b']) + + def test_get_metadata_has_track_album(self): + self.backend.current_playlist.append([Track(album=Album(name='a'))]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:album', result.keys()) + self.assertEquals(result['xesam:album'], 'a') + + def test_get_metadata_has_track_album_artists(self): + self.backend.current_playlist.append([Track(album=Album(artists=[ + Artist(name='a'), Artist(name='b'), Artist(name=None)]))]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:albumArtist', result.keys()) + self.assertEquals(result['xesam:albumArtist'], ['a', 'b']) + + def test_get_metadata_has_track_number_in_album(self): + self.backend.current_playlist.append([Track(track_no=7)]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:trackNumber', result.keys()) + self.assertEquals(result['xesam:trackNumber'], 7) + def test_get_volume_should_return_volume_between_zero_and_one(self): self.mixer.volume = 0 result = self.mpris.Get(mpris.PLAYER_IFACE, 'Volume')