Skip to content
This repository was archived by the owner on Aug 7, 2024. It is now read-only.

Commit 69af23c

Browse files
authored
Merge pull request #439 from bear/fix/issue433
Fix to upload video/gifs to correct endpoint if filesize < self.chunk_size
2 parents 88c5da0 + 5640c42 commit 69af23c

3 files changed

Lines changed: 28 additions & 11 deletions

File tree

tests/test_api_30.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22
from __future__ import unicode_literals, print_function
33

44
import json
5+
import os
56
import re
67
import sys
8+
from tempfile import NamedTemporaryFile
79
import unittest
10+
try:
11+
from unittest.mock import patch
12+
except ImportError:
13+
from mock import patch
814
import warnings
915

1016
import twitter
@@ -1713,3 +1719,16 @@ def test_UpdateBackgroundImage_deprecation(self):
17131719
with warnings.catch_warnings(record=True) as w:
17141720
resp = self.api.UpdateBackgroundImage(image='testdata/168NQ.jpg')
17151721
self.assertTrue(issubclass(w[0].category, DeprecationWarning))
1722+
1723+
@responses.activate
1724+
@patch('twitter.api.Api.UploadMediaChunked')
1725+
def test_UploadSmallVideoUsesChunkedData(self, mocker):
1726+
responses.add(POST, DEFAULT_URL, body='{}')
1727+
video = NamedTemporaryFile(suffix='.mp4')
1728+
video.write(b'10' * 1024)
1729+
video.seek(0, 0)
1730+
1731+
resp = self.api.PostUpdate('test', media=video)
1732+
assert os.path.getsize(video.name) <= 1024 * 1024
1733+
assert isinstance(resp, twitter.Status)
1734+
assert twitter.api.Api.UploadMediaChunked.called

twitter/api.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,7 @@ def PostUpdate(self,
10241024
parameters['attachment_url'] = attachment_url
10251025

10261026
if media:
1027+
chunked_types = ['video/mp4', 'video/quicktime', 'image/gif']
10271028
media_ids = []
10281029
if isinstance(media, int):
10291030
media_ids.append(media)
@@ -1039,9 +1040,8 @@ def PostUpdate(self,
10391040
_, _, file_size, media_type = parse_media_file(media_file)
10401041
if media_type == 'image/gif' or media_type == 'video/mp4':
10411042
raise TwitterError(
1042-
'You cannot post more than 1 GIF or 1 video in a '
1043-
'single status.')
1044-
if file_size > self.chunk_size:
1043+
'You cannot post more than 1 GIF or 1 video in a single status.')
1044+
if file_size > self.chunk_size or media_type in chunked_types:
10451045
media_id = self.UploadMediaChunked(
10461046
media=media_file,
10471047
additional_owners=media_additional_owners,
@@ -1053,13 +1053,11 @@ def PostUpdate(self,
10531053
media_category=media_category)
10541054
media_ids.append(media_id)
10551055
else:
1056-
_, _, file_size, _ = parse_media_file(media)
1057-
if file_size > self.chunk_size:
1058-
media_ids.append(
1059-
self.UploadMediaChunked(media, media_additional_owners))
1056+
_, _, file_size, media_type = parse_media_file(media)
1057+
if file_size > self.chunk_size or media_type in chunked_types:
1058+
media_ids.append(self.UploadMediaChunked(media, media_additional_owners))
10601059
else:
1061-
media_ids.append(
1062-
self.UploadMediaSimple(media, media_additional_owners))
1060+
media_ids.append(self.UploadMediaSimple(media, media_additional_owners))
10631061
parameters['media_ids'] = ','.join([str(mid) for mid in media_ids])
10641062

10651063
if latitude is not None and longitude is not None:

twitter/twitter_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ def parse_media_file(passed_media):
223223
# Otherwise, if a file object was passed in the first place,
224224
# create the standard reference to media_file (i.e., rename it to fp).
225225
else:
226-
if passed_media.mode != 'rb':
227-
raise TwitterError({'message': 'File mode must be "rb".'})
226+
if passed_media.mode not in ['rb', 'rb+', 'w+b']:
227+
raise TwitterError('File mode must be "rb" or "rb+"')
228228
filename = os.path.basename(passed_media.name)
229229
data_file = passed_media
230230

0 commit comments

Comments
 (0)