def test_track_to_mpd_format_with_stream_and_no_track_name(self): track = self.track.replace(name=None) result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST, stream_title="foo") assert ("Name", "") not in result assert ("Title", "foo") in result
def test_track_to_mpd_format_for_nonempty_track(self): result = translator.track_to_mpd_format(TlTrack(122, self.track), tagtype_list.TAGTYPE_LIST, position=9) assert ("file", "à uri") in result assert ("Time", 137) in result assert ("Artist", "an artist") in result assert ("Artist", "yet another artist") in result assert ("Title", "a nàme") in result assert ("Album", "an album") in result assert ("AlbumArtist", "an other artist") in result assert ("AlbumArtist", "still another artist") in result assert ("Composer", "a composer") in result assert ("Composer", "another composer") in result assert ("Performer", "a performer") in result assert ("Performer", "another performer") in result assert ("Genre", "a genre") in result assert ("Track", "7/13") in result assert ("Date", "1977-01-01") in result assert ("Disc", 1) in result assert ("Pos", 9) in result assert ("Id", 122) in result assert ("X-AlbumUri", "urischeme:àlbum:12345") in result assert ("Comment", "a comment") not in result assert len(result) == 19
def listallinfo(context, uri=None): """ *musicpd.org, music database section:* ``listallinfo [URI]`` Same as ``listall``, except it also returns metadata info in the same format as ``lsinfo``. Do not use this command. Do not manage a client-side copy of MPD's database. That is fragile and adds huge overhead. It will break with large databases. Instead, query MPD whenever you need something. .. warning:: This command is disabled by default in Mopidy installs. """ result = [] for path, lookup_future in context.browse(uri): if not lookup_future: result.append(("directory", path.lstrip("/"))) else: for tracks in lookup_future.get().values(): for track in tracks: result.extend(translator.track_to_mpd_format(track)) return result
def plchanges(context, version): """ *musicpd.org, current playlist section:* ``plchanges {VERSION}`` Displays changed songs currently in the playlist since ``VERSION``. To detect songs that were deleted at the end of the playlist, use ``playlistlength`` returned by status command. *MPDroid:* - Calls ``plchanges "-1"`` two times per second to get the entire playlist. """ # XXX Naive implementation that returns all tracks as changed tracklist_version = context.core.tracklist.get_version().get() if version < tracklist_version: return translator.tracks_to_mpd_format( context.core.tracklist.get_tl_tracks().get()) elif version == tracklist_version: # A version match could indicate this is just a metadata update, so # check for a stream ref and let the client know about the change. stream_title = context.core.playback.get_stream_title().get() if stream_title is None: return None tl_track = context.core.playback.get_current_tl_track().get() position = context.core.tracklist.index(tl_track).get() return translator.track_to_mpd_format(tl_track, position=position, stream_title=stream_title)
def test_track_to_mpd_format_musicbrainz_albumartistid(self): artist = list(self.track.artists)[0].replace(musicbrainz_id="foo") album = self.track.album.replace(artists=[artist]) track = self.track.replace(album=album) result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST) assert ("MUSICBRAINZ_ALBUMARTISTID", "foo") in result
def lsinfo(context, uri=None): """ *musicpd.org, music database section:* ``lsinfo [URI]`` Lists the contents of the directory ``URI``. When listing the root directory, this currently returns the list of stored playlists. This behavior is deprecated; use ``listplaylists`` instead. MPD returns the same result, including both playlists and the files and directories located at the root level, for both ``lsinfo``, ``lsinfo ""``, and ``lsinfo "/"``. """ result = [] for path, lookup_future in context.browse(uri, recursive=False): if not lookup_future: result.append(("directory", path.lstrip("/"))) else: for tracks in lookup_future.get().values(): if tracks: result.extend(translator.track_to_mpd_format(tracks[0])) if uri in (None, "", "/"): result.extend(protocol.stored_playlists.listplaylists(context)) return result
def test_track_to_mpd_format_with_position_and_tlid(self): result = translator.track_to_mpd_format( TlTrack(2, Track(uri="a uri")), tagtype_list.TAGTYPE_LIST, position=1, ) assert ("Pos", 1) in result assert ("Id", 2) in result
def test_track_to_mpd_format_for_empty_track(self): result = translator.track_to_mpd_format( Track(uri="a uri", length=137000), tagtype_list.TAGTYPE_LIST) assert ("file", "a uri") in result assert ("Time", 137) in result assert ("Artist", "") not in result assert ("Title", "") not in result assert ("Album", "") not in result assert ("Track", 0) not in result assert ("Date", "") not in result assert len(result) == 2
def playlistfind(context, tag, needle): """ *musicpd.org, current playlist section:* ``playlistfind {TAG} {NEEDLE}`` Finds songs in the current playlist with strict matching. """ if tag == "filename": tl_tracks = context.core.tracklist.filter({"uri": [needle]}).get() if not tl_tracks: return None position = context.core.tracklist.index(tl_tracks[0]).get() return translator.track_to_mpd_format(tl_tracks[0], position=position) raise exceptions.MpdNotImplemented # TODO
def currentsong(context): """ *musicpd.org, status section:* ``currentsong`` Displays the song info of the current song (same song that is identified in status). """ tl_track = context.core.playback.get_current_tl_track().get() stream_title = context.core.playback.get_stream_title().get() if tl_track is not None: position = context.core.tracklist.index(tl_track).get() return translator.track_to_mpd_format( tl_track, position=position, stream_title=stream_title )
def playlistid(context, tlid=None): """ *musicpd.org, current playlist section:* ``playlistid {SONGID}`` Displays a list of songs in the playlist. ``SONGID`` is optional and specifies a single song to display info for. """ if tlid is not None: tl_tracks = context.core.tracklist.filter({"tlid": [tlid]}).get() if not tl_tracks: raise exceptions.MpdNoExistError("No such song") position = context.core.tracklist.index(tl_tracks[0]).get() return translator.track_to_mpd_format(tl_tracks[0], position=position) else: return translator.tracks_to_mpd_format( context.core.tracklist.get_tl_tracks().get())
def test_track_to_mpd_client_filtered(self): configured_tagtypes = [ "Artist", "Album", "Title", "Track", "Name", "Genre", ] result = translator.track_to_mpd_format(TlTrack(122, self.track), configured_tagtypes, position=9) assert ("file", "à uri") in result assert ("Time", 137) in result assert ("Artist", "an artist") in result assert ("Artist", "yet another artist") in result assert ("Title", "a nàme") in result assert ("Album", "an album") in result assert ("Genre", "a genre") in result assert ("Track", "7/13") in result assert ("Pos", 9) in result assert ("Id", 122) in result assert len(result) == 10
def test_track_to_mpd_format_musicbrainz_albumid(self): album = self.track.album.replace(musicbrainz_id="foo") track = self.track.replace(album=album) result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST) assert ("MUSICBRAINZ_ALBUMID", "foo") in result
def test_track_to_mpd_format_musicbrainz_artistid(self): artist = list(self.track.artists)[0].replace(musicbrainz_id="foo") track = self.track.replace(artists=[artist]) result = translator.track_to_mpd_format(track) assert ("MUSICBRAINZ_ARTISTID", "foo") in result
def test_track_to_mpd_format_with_stream_title(self): result = translator.track_to_mpd_format(self.track, stream_title="foo") assert ("Name", "a nàme") in result assert ("Title", "foo") in result
def test_track_to_mpd_format_with_position(self): result = translator.track_to_mpd_format(Track(), position=1) assert ("Pos", 1) not in result
def test_track_to_mpd_format_with_tlid(self): result = translator.track_to_mpd_format(TlTrack(1, Track()), tagtype_list.TAGTYPE_LIST) assert ("Id", 1) not in result
def test_track_to_mpd_format_with_position(self): result = translator.track_to_mpd_format(Track(), tagtype_list.TAGTYPE_LIST, position=1) assert ("Pos", 1) not in result
def test_track_to_mpd_format_with_tlid(self): result = translator.track_to_mpd_format(TlTrack(1, Track())) assert ("Id", 1) not in result
def test_track_to_mpd_format_with_position_and_tlid(self): result = translator.track_to_mpd_format( TlTrack(2, Track(uri="a uri")), position=1 ) assert ("Pos", 1) in result assert ("Id", 2) in result
def test_track_to_mpd_format_with_empty_stream_title(self): result = translator.track_to_mpd_format(self.track, tagtype_list.TAGTYPE_LIST, stream_title="") assert ("Name", "a nàme") in result assert ("Title", "") not in result
def test_track_to_mpd_format_musicbrainz_trackid(self): track = self.track.replace(musicbrainz_id="foo") result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST) assert ("MUSICBRAINZ_TRACKID", "foo") in result
def test_track_to_mpd_format_with_last_modified_of_zero(self): track = self.track.replace(last_modified=0) result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST) keys = [k for k, v in result] assert "Last-Modified" not in keys
def test_track_to_mpd_format_with_last_modified(self): track = self.track.replace(last_modified=995303899000) result = translator.track_to_mpd_format(track, tagtype_list.TAGTYPE_LIST) assert ("Last-Modified", "2001-07-16T17:18:19Z") in result