Skip to content
This repository was archived by the owner on Aug 7, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions tests/test_api_30.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@
from __future__ import unicode_literals, print_function

import json
import os
import re
import sys
from tempfile import NamedTemporaryFile
import unittest
try:
from unittest.mock import patch
except ImportError:
from mock import patch
import warnings

import twitter
Expand Down Expand Up @@ -1713,3 +1719,16 @@ def test_UpdateBackgroundImage_deprecation(self):
with warnings.catch_warnings(record=True) as w:
resp = self.api.UpdateBackgroundImage(image='testdata/168NQ.jpg')
self.assertTrue(issubclass(w[0].category, DeprecationWarning))

@responses.activate
@patch('twitter.api.Api.UploadMediaChunked')
def test_UploadSmallVideoUsesChunkedData(self, mocker):
responses.add(POST, DEFAULT_URL, body='{}')
video = NamedTemporaryFile(suffix='.mp4')
video.write(b'10' * 1024)
video.seek(0, 0)

resp = self.api.PostUpdate('test', media=video)
assert os.path.getsize(video.name) <= 1024 * 1024
assert isinstance(resp, twitter.Status)
assert twitter.api.Api.UploadMediaChunked.called
18 changes: 8 additions & 10 deletions twitter/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1026,6 +1026,7 @@ def PostUpdate(self,
parameters['attachment_url'] = attachment_url

if media:
chunked_types = ['video/mp4', 'video/quicktime', 'image/gif']
media_ids = []
if isinstance(media, int):
media_ids.append(media)
Expand All @@ -1041,9 +1042,8 @@ def PostUpdate(self,
_, _, file_size, media_type = parse_media_file(media_file)
if media_type == 'image/gif' or media_type == 'video/mp4':
raise TwitterError(
'You cannot post more than 1 GIF or 1 video in a '
'single status.')
if file_size > self.chunk_size:
'You cannot post more than 1 GIF or 1 video in a single status.')
if file_size > self.chunk_size or media_type in chunked_types:
media_id = self.UploadMediaChunked(
media=media_file,
additional_owners=media_additional_owners,
Expand All @@ -1055,13 +1055,11 @@ def PostUpdate(self,
media_category=media_category)
media_ids.append(media_id)
else:
_, _, file_size, _ = parse_media_file(media)
if file_size > self.chunk_size:
media_ids.append(
self.UploadMediaChunked(media, media_additional_owners))
_, _, file_size, media_type = parse_media_file(media)
if file_size > self.chunk_size or media_type in chunked_types:
media_ids.append(self.UploadMediaChunked(media, media_additional_owners))
else:
media_ids.append(
self.UploadMediaSimple(media, media_additional_owners))
media_ids.append(self.UploadMediaSimple(media, media_additional_owners))
parameters['media_ids'] = ','.join([str(mid) for mid in media_ids])

if latitude is not None and longitude is not None:
Expand Down Expand Up @@ -1263,7 +1261,7 @@ def _UploadMediaChunkedAppend(self,

try:
media_fp.close()
except:
except Exception as e:
pass

return True
Expand Down
6 changes: 3 additions & 3 deletions twitter/twitter_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,8 @@ def parse_media_file(passed_media):
# Otherwise, if a file object was passed in the first place,
# create the standard reference to media_file (i.e., rename it to fp).
else:
if passed_media.mode != 'rb':
raise TwitterError({'message': 'File mode must be "rb".'})
if passed_media.mode not in ['rb', 'rb+', 'w+b']:
raise TwitterError('File mode must be "rb" or "rb+"')
filename = os.path.basename(passed_media.name)
data_file = passed_media

Expand All @@ -233,7 +233,7 @@ def parse_media_file(passed_media):

try:
data_file.seek(0)
except:
except Exception as e:
pass

media_type = mimetypes.guess_type(os.path.basename(filename))[0]
Expand Down