Beispiel #1
0
 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
Beispiel #2
0
 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
Beispiel #3
0
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)
Beispiel #5
0
 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
Beispiel #6
0
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
Beispiel #7
0
 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
Beispiel #8
0
 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
Beispiel #10
0
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())
Beispiel #12
0
 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
Beispiel #13
0
 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
Beispiel #14
0
 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
Beispiel #15
0
 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
Beispiel #16
0
 def test_track_to_mpd_format_with_position(self):
     result = translator.track_to_mpd_format(Track(), position=1)
     assert ("Pos", 1) not in result
Beispiel #17
0
 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
Beispiel #18
0
 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
Beispiel #19
0
 def test_track_to_mpd_format_with_tlid(self):
     result = translator.track_to_mpd_format(TlTrack(1, Track()))
     assert ("Id", 1) not in result
Beispiel #20
0
 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
Beispiel #21
0
 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
Beispiel #22
0
 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
Beispiel #23
0
 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
Beispiel #24
0
 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