Add wait_for_async_finalize parameter for API.chunked_upload
authorHarmon <Harmon758@gmail.com>
Sun, 21 Feb 2021 04:24:38 +0000 (22:24 -0600)
committerHarmon <Harmon758@gmail.com>
Sun, 21 Feb 2021 04:24:38 +0000 (22:24 -0600)
docs/api.rst
tweepy/api.py

index 4dd8ef3b6182008e68d471ca0e20eca5cc27b86e..9c719efe4f3fe94218ac94196d5f183b93afeec2 100644 (file)
@@ -1322,8 +1322,11 @@ Media methods
                              [additional_owners])
 
    Use this to upload media to Twitter.
-   This automatically uses the chunked upload endpoints for videos.
    This calls either :func:`API.simple_upload` or :func:`API.chunked_upload`.
+   Chunked media upload is automatically used for videos.
+   If ``chunked`` is set or the media is a video, ``wait_for_async_finalize``
+   can be specified as a keyword argument to be passed to
+   :func:`API.chunked_upload`.
 
    :param filename: |filename|
    :param file: |file|
@@ -1351,16 +1354,21 @@ Media methods
 
 
 .. method:: API.chunked_upload(filename, [file], [file_type], \
-                               [media_category], [additional_owners])
+                               [wait_for_async_finalize], [media_category], \
+                               [additional_owners])
 
    Use this to upload media to Twitter.
    This uses the chunked upload endpoints and calls
    :func:`API.chunked_upload_init`, :func:`API.chunked_upload_append`, and
    :func:`API.chunked_upload_finalize`.
+   If ``wait_for_async_finalize`` is set, this calls
+   :func:`API.get_media_upload_status` as well.
 
    :param filename: |filename|
    :param file: |file|
    :param file_type: The MIME type of the media being uploaded.
+   :param wait_for_async_finalize: Whether to wait for Twitter's API to finish
+                                   processing the media. Defaults to ``True``.
    :param media_category: |media_category|
    :param additional_owners: |additional_owners|
 
index 933f07dbd593b9ee80b0c5c669cc111aac198141..b011e993a640d97225196dc12c3f4f1d8422da82 100644 (file)
@@ -370,7 +370,8 @@ class API:
         )
 
     def chunked_upload(self, filename, *, file=None, file_type=None,
-                       media_category=None, additional_owners=None, **kwargs):
+                       wait_for_async_finalize=True, media_category=None,
+                       additional_owners=None, **kwargs):
         """ :reference https://developer.twitter.com/en/docs/media/upload-media/uploading-media/chunked-media-upload
         """
         fp = file or open(filename, 'rb')
@@ -404,8 +405,14 @@ class API:
             )
 
         fp.close()
-        # The FINALIZE command returns media information
-        return self.chunked_upload_finalize(media_id, **kwargs)
+        media =  self.chunked_upload_finalize(media_id, **kwargs)
+
+        if wait_for_async_finalize and hasattr(media, 'processing_info'):
+            while media.processing_info['state'] in ('pending', 'in_progress'):
+                time.sleep(media.processing_info['check_after_secs'])
+                media = self.get_media_upload_status(media.media_id, **kwargs)
+
+        return media
 
     @payload('media')
     def chunked_upload_init(self, total_bytes, media_type, *,