Ejemplo n.º 1
0
    def sync(self, sync_item, client=None, clientId=None):
        """ Adds specified sync item for the client. It's always easier to use methods defined directly in the media
            objects, e.g. :func:`plexapi.video.Video.sync`, :func:`plexapi.audio.Audio.sync`.

            Parameters:
                client (:class:`~plexapi.myplex.MyPlexDevice`): a client for which you need to add SyncItem to.
                clientId (str): an identifier of a client for which you need to add SyncItem to.
                sync_item (:class:`plexapi.sync.SyncItem`): prepared SyncItem object with all fields set.

            If both `client` and `clientId` provided the client would be preferred.
            If neither `client` nor `clientId` provided the clientId would be set to current clients`s identifier.

            Returns:
                :class:`plexapi.sync.SyncItem`: an instance of created syncItem.

            Raises:
                :class:`plexapi.exceptions.BadRequest`: when client with provided clientId wasn`t found.
                :class:`plexapi.exceptions.BadRequest`: provided client doesn`t provides `sync-target`.
        """
        if not client and not clientId:
            clientId = X_PLEX_IDENTIFIER

        if not client:
            for device in self.devices():
                if device.clientIdentifier == clientId:
                    client = device
                    break

            if not client:
                raise BadRequest('Unable to find client by clientId=%s',
                                 clientId)

        if 'sync-target' not in client.provides:
            raise BadRequest('Received client doesn`t provides sync-target')

        params = {
            'SyncItem[title]':
            sync_item.title,
            'SyncItem[rootTitle]':
            sync_item.rootTitle,
            'SyncItem[metadataType]':
            sync_item.metadataType,
            'SyncItem[machineIdentifier]':
            sync_item.machineIdentifier,
            'SyncItem[contentType]':
            sync_item.contentType,
            'SyncItem[Policy][scope]':
            sync_item.policy.scope,
            'SyncItem[Policy][unwatched]':
            str(int(sync_item.policy.unwatched)),
            'SyncItem[Policy][value]':
            str(sync_item.policy.value if hasattr(sync_item.policy, 'value'
                                                  ) else 0),
            'SyncItem[Location][uri]':
            sync_item.location,
            'SyncItem[MediaSettings][audioBoost]':
            str(sync_item.mediaSettings.audioBoost),
            'SyncItem[MediaSettings][maxVideoBitrate]':
            str(sync_item.mediaSettings.maxVideoBitrate),
            'SyncItem[MediaSettings][musicBitrate]':
            str(sync_item.mediaSettings.musicBitrate),
            'SyncItem[MediaSettings][photoQuality]':
            str(sync_item.mediaSettings.photoQuality),
            'SyncItem[MediaSettings][photoResolution]':
            sync_item.mediaSettings.photoResolution,
            'SyncItem[MediaSettings][subtitleSize]':
            str(sync_item.mediaSettings.subtitleSize),
            'SyncItem[MediaSettings][videoQuality]':
            str(sync_item.mediaSettings.videoQuality),
            'SyncItem[MediaSettings][videoResolution]':
            sync_item.mediaSettings.videoResolution,
        }

        url = SyncList.key.format(clientId=client.clientIdentifier)
        data = self.query(url,
                          method=self._session.post,
                          headers={
                              'Content-type': 'x-www-form-urlencoded',
                          },
                          params=params)

        return SyncItem(self,
                        data,
                        None,
                        clientIdentifier=client.clientIdentifier)
Ejemplo n.º 2
0
    def sync(self,
             videoQuality=None,
             photoResolution=None,
             audioBitrate=None,
             client=None,
             clientId=None,
             limit=None,
             unwatched=False,
             title=None):
        """ Add the collection as sync item for the specified device.
            See :func:`~plexapi.myplex.MyPlexAccount.sync` for possible exceptions.

            Parameters:
                videoQuality (int): idx of quality of the video, one of VIDEO_QUALITY_* values defined in
                                    :mod:`~plexapi.sync` module. Used only when collection contains video.
                photoResolution (str): maximum allowed resolution for synchronized photos, see PHOTO_QUALITY_* values in
                                       the module :mod:`~plexapi.sync`. Used only when collection contains photos.
                audioBitrate (int): maximum bitrate for synchronized music, better use one of MUSIC_BITRATE_* values
                                    from the module :mod:`~plexapi.sync`. Used only when collection contains audio.
                client (:class:`~plexapi.myplex.MyPlexDevice`): sync destination, see
                                                               :func:`~plexapi.myplex.MyPlexAccount.sync`.
                clientId (str): sync destination, see :func:`~plexapi.myplex.MyPlexAccount.sync`.
                limit (int): maximum count of items to sync, unlimited if `None`.
                unwatched (bool): if `True` watched videos wouldn't be synced.
                title (str): descriptive title for the new :class:`~plexapi.sync.SyncItem`, if empty the value would be
                             generated from metadata of current photo.

            Raises:
                :exc:`~plexapi.exceptions.BadRequest`: When collection is not allowed to sync.
                :exc:`~plexapi.exceptions.Unsupported`: When collection content is unsupported.

            Returns:
                :class:`~plexapi.sync.SyncItem`: A new instance of the created sync item.
        """
        if not self.section().allowSync:
            raise BadRequest('The collection is not allowed to sync')

        from plexapi.sync import SyncItem, Policy, MediaSettings

        myplex = self._server.myPlexAccount()
        sync_item = SyncItem(self._server, None)
        sync_item.title = title if title else self.title
        sync_item.rootTitle = self.title
        sync_item.contentType = self.listType
        sync_item.metadataType = self.metadataType
        sync_item.machineIdentifier = self._server.machineIdentifier

        sync_item.location = 'library:///directory/%s' % quote_plus(
            '%s/children?excludeAllLeaves=1' % (self.key))
        sync_item.policy = Policy.create(limit, unwatched)

        if self.isVideo:
            sync_item.mediaSettings = MediaSettings.createVideo(videoQuality)
        elif self.isAudio:
            sync_item.mediaSettings = MediaSettings.createMusic(audioBitrate)
        elif self.isPhoto:
            sync_item.mediaSettings = MediaSettings.createPhoto(
                photoResolution)
        else:
            raise Unsupported('Unsupported collection content')

        return myplex.sync(sync_item, client=client, clientId=clientId)