Allow adding items from different servers to playlist by JonnyWong16 · Pull Request #1411 · pushingkarmaorg/python-plexapi

I currently put together something like this. this is able to take existing playlist (via server.playlist() call) and save it.

def addItems(self, items):
    """ Add items to the playlist.

        Parameters:
            items (List): List of :class:`~plexapi.audio.Audio`, :class:`~plexapi.video.Video`,
                or :class:`~plexapi.photo.Photo` objects to be added to the playlist.

        Raises:
            :class:`plexapi.exceptions.BadRequest`: When trying to add items to a smart playlist.
    """
    if self.smart:
        raise BadRequest('Cannot add items to a smart playlist.')

    if items and not isinstance(items, (list, tuple)):
        items = [items]

    # Group items by server to maintain order when adding items from multiple servers
    # for server, _items in groupby(items, key=lambda item: item._server):
    for sourceURI, _items in groupby(items, key=lambda item: item.sourceURI):
        ratingKeys = []
        for item in _items:
            if item.listType != self.playlistType:  # pragma: no cover
                raise BadRequest(f'Can not mix media types when building a playlist: '
                                 f'{self.playlistType} and {item.listType}')
            sourceURI = item._server._uriRoot() if sourceURI is None else sourceURI
            ratingKeys.append(str(item.ratingKey))

        ratingKeys = ','.join(ratingKeys)
        # uri = f'{server._uriRoot()}/library/metadata/{ratingKeys}'
        uri = f'{sourceURI}/library/metadata/{ratingKeys}'

        args = {'uri': uri}
        key = f"{self.key}/items{utils.joinArgs(args)}"
        self._server.query(key, method=self._server._session.put)

    return self