Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "skipFriendship" option to inviteFriend calls #1189

Open
edrock200 opened this issue Jul 21, 2023 · 2 comments
Open

Add "skipFriendship" option to inviteFriend calls #1189

edrock200 opened this issue Jul 21, 2023 · 2 comments

Comments

@edrock200
Copy link

edrock200 commented Jul 21, 2023

What is your feature request?

Plex has added a new "Friends" feature in which you can be friends with people who are not on your server and vice versa, not be friends with someone who has guest access to your server. The GUI now prompts when adding someone to ask if you want to add them as a friend as well. The existing API call now defaults to adding them as a friend. However, via curl you can add the option of
"skipFriendship": true

Unless I'm missing something, I don't believe the python library can do this right now. I tried adding it as an option to the invite but get the error -
TypeError: inviteFriend() got an unexpected keyword argument 'skipFriendship'

Are there any workarounds?

Use the gui or remove the invited guest as a friend after the invite is sent via the gui

Code Snippets

edit I know nothing about python or coding. but I did modify this section of myplex.py to add the skipFriendship to the def invitefriend section as well as a skipFriendship under params, and inital testing, it seems to work:
(edit2 proving how bad I am at this, I cannot for the life of me get this code to paste in properly. My apologies lol)

` def inviteFriend(self, user, server, sections=None, allowSync=False, allowCameraUpload=False,
allowChannels=False, filterMovies=None, filterTelevision=None, filterMusic=None, skipFriendship=True):
""" Share library content with the specified user.

        Parameters:
            user (:class:`~plexapi.myplex.MyPlexUser`): `MyPlexUser` object, username, or email
                of the user to be added.
            server (:class:`~plexapi.server.PlexServer`): `PlexServer` object, or machineIdentifier
                containing the library sections to share.
            sections (List<:class:`~plexapi.library.LibrarySection`>): List of `LibrarySection` objects, or names
                to be shared (default None). `sections` must be defined in order to update shared libraries.
            allowSync (Bool): Set True to allow user to sync content.
            skipFriendship (Bool): Set True to allow user to sync content.
            allowCameraUpload (Bool): Set True to allow user to upload photos.
            allowChannels (Bool): Set True to allow user to utilize installed channels.
            filterMovies (Dict): Dict containing key 'contentRating' and/or 'label' each set to a list of
                values to be filtered. ex: `{'contentRating':['G'], 'label':['foo']}`
            filterTelevision (Dict): Dict containing key 'contentRating' and/or 'label' each set to a list of
                values to be filtered. ex: `{'contentRating':['G'], 'label':['foo']}`
            filterMusic (Dict): Dict containing key 'label' set to a list of values to be filtered.
                ex: `{'label':['foo']}`
    """
    username = user.username if isinstance(user, MyPlexUser) else user
    machineId = server.machineIdentifier if isinstance(server, PlexServer) else server
    sectionIds = self._getSectionIds(machineId, sections)
    params = {
        'server_id': machineId,
        'shared_server': {'library_section_ids': sectionIds, 'invited_email': username},
        'sharing_settings': {
            'allowSync': ('1' if allowSync else '0'),
            'skipFriendship': ('1' if allowSync else '0'),
            'allowCameraUpload': ('1' if allowCameraUpload else '0'),
            'allowChannels': ('1' if allowChannels else '0'),
            'filterMovies': self._filterDictToStr(filterMovies or {}),
            'filterTelevision': self._filterDictToStr(filterTelevision or {}),
            'filterMusic': self._filterDictToStr(filterMusic or {}),
        },
    }`

Additional Context

Would be nice to have this implemented for other functions too such as modify an existing user, add a friend, remove a friend, etc.

@edrock200
Copy link
Author

Not the above actually doesn't work. It still adds as a friend

@razor2611
Copy link

razor2611 commented Nov 14, 2024

You're using it wrong. Here's a working one.

    def inviteFriend(self, user, server, sections=None, skipFriendship=False, allowSync=False, allowCameraUpload=False,
                     allowChannels=False, filterMovies=None, filterTelevision=None, filterMusic=None):
        """ Share library content with the specified user.

            Parameters:
                user (:class:`~plexapi.myplex.MyPlexUser`): `MyPlexUser` object, username, or email
                    of the user to be added.
                server (:class:`~plexapi.server.PlexServer`): `PlexServer` object, or machineIdentifier
                    containing the library sections to share.
                sections (List<:class:`~plexapi.library.LibrarySection`>): List of `LibrarySection` objects, or names
                    to be shared (default None). `sections` must be defined in order to update shared libraries.
                skipFriendship (Bool): Set to true if you don't want to add the user as a frind.
                allowSync (Bool): Set True to allow user to sync content.
                allowCameraUpload (Bool): Set True to allow user to upload photos.
                allowChannels (Bool): Set True to allow user to utilize installed channels.
                filterMovies (Dict): Dict containing key 'contentRating' and/or 'label' each set to a list of
                    values to be filtered. ex: `{'contentRating':['G'], 'label':['foo']}`
                filterTelevision (Dict): Dict containing key 'contentRating' and/or 'label' each set to a list of
                    values to be filtered. ex: `{'contentRating':['G'], 'label':['foo']}`
                filterMusic (Dict): Dict containing key 'label' set to a list of values to be filtered.
                    ex: `{'label':['foo']}`
        """
        username = user.username if isinstance(user, MyPlexUser) else user
        machineId = server.machineIdentifier if isinstance(server, PlexServer) else server
        sectionIds = self._getSectionIds(machineId, sections)
        params = {
            'server_id': machineId,
            'shared_server': {'library_section_ids': sectionIds, 'invited_email': username, 'skipFriendship': skipFriendship},
            'sharing_settings': {
                'allowSync': ('1' if allowSync else '0'),
                'allowCameraUpload': ('1' if allowCameraUpload else '0'),
                'allowChannels': ('1' if allowChannels else '0'),
                'filterMovies': self._filterDictToStr(filterMovies or {}),
                'filterTelevision': self._filterDictToStr(filterTelevision or {}),
                'filterMusic': self._filterDictToStr(filterMusic or {}),
            },
        }
        headers = {'Content-Type': 'application/json'}
        url = self.FRIENDINVITE.format(machineId=machineId)
        return self.query(url, self._session.post, json=params, headers=headers)

'
You use it like this:

        plex.myPlexAccount().inviteFriend(user=username, server=plex, sections=libs, skipFriendship=True, allowSync=False,
                                          allowCameraUpload=False, allowChannels=False, filterMovies=None,
                                          filterTelevision=None, filterMusic=None)

The remove friends function should be fixed too as it updates the user and not removed it from friends.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants