goinsta icon indicating copy to clipboard operation
goinsta copied to clipboard

Uploading Videos

Open LoganHenderson opened this issue 5 years ago • 9 comments

Going through the code the only upload methods I see are func (insta *Instagram) UploadPhoto(photo io.Reader, photoCaption string, quality int, filterType int) (Item, error) Is there an issue with supporting video uploads?

I've noticed similar python libraries offer video upload support.

LoganHenderson avatar Apr 13 '19 21:04 LoganHenderson

It's not implemented in this library. Implementing it is not a problem, but there's not enough time for it. But as you said, you can find Python and PHP versions of it.

ahmdrz avatar Apr 14 '19 08:04 ahmdrz

Hey

I need this feature. I am willing to work on this if you can point me in the right direction. I had a look at the php code. It was greek and latin to me.

arjunmahishi avatar May 06 '19 17:05 arjunmahishi

@arjunmahishi I am willing to work on this issue as well.

I will grab reference to python implementation of video uploads, post here, and try to get something started.

LoganHenderson avatar May 06 '19 17:05 LoganHenderson

Sure... It doesn't look impossible, we can do this

arjunmahishi avatar May 06 '19 17:05 arjunmahishi

def uploadVideo(self, video, thumbnail, caption=None, upload_id=None, is_sidecar=None):
        if upload_id is None:
            upload_id = str(int(time.time() * 1000))
        data = {'upload_id': upload_id,
                '_csrftoken': self.token,
                'media_type': '2',
                '_uuid': self.uuid}
        if is_sidecar:
            data['is_sidecar'] = '1'
        m = MultipartEncoder(data, boundary=self.uuid)
        self.s.headers.update({'X-IG-Capabilities': '3Q4=',
                               'X-IG-Connection-Type': 'WIFI',
                               'Host': 'i.instagram.com',
                               'Cookie2': '$Version=1',
                               'Accept-Language': 'en-US',
                               'Accept-Encoding': 'gzip, deflate',
                               'Content-type': m.content_type,
                               'Connection': 'keep-alive',
                               'User-Agent': self.USER_AGENT})
        response = self.s.post(self.API_URL + "upload/video/", data=m.to_string())
        if response.status_code == 200:
            body = json.loads(response.text)
            upload_url = body['video_upload_urls'][3]['url']
            upload_job = body['video_upload_urls'][3]['job']

            videoData = open(video, 'rb').read()
            # solve issue #85 TypeError: slice indices must be integers or None or have an __index__ method
            request_size = int(math.floor(len(videoData) / 4))
            lastRequestExtra = (len(videoData) - (request_size * 3))

            headers = copy.deepcopy(self.s.headers)
            self.s.headers.update({'X-IG-Capabilities': '3Q4=',
                                   'X-IG-Connection-Type': 'WIFI',
                                   'Cookie2': '$Version=1',
                                   'Accept-Language': 'en-US',
                                   'Accept-Encoding': 'gzip, deflate',
                                   'Content-type': 'application/octet-stream',
                                   'Session-ID': upload_id,
                                   'Connection': 'keep-alive',
                                   'Content-Disposition': 'attachment; filename="video.mov"',
                                   'job': upload_job,
                                   'Host': 'upload.instagram.com',
                                   'User-Agent': self.USER_AGENT})
            for i in range(0, 4):
                start = i * request_size
                if i == 3:
                    end = i * request_size + lastRequestExtra
                else:
                    end = (i + 1) * request_size
                length = lastRequestExtra if i == 3 else request_size
                content_range = "bytes {start}-{end}/{lenVideo}".format(start=start, end=(end - 1),
                                                                        lenVideo=len(videoData)).encode('utf-8')

                self.s.headers.update({'Content-Length': str(end - start), 'Content-Range': content_range, })
                response = self.s.post(upload_url, data=videoData[start:start + length])
            self.s.headers = headers

            if response.status_code == 200:
                if self.configureVideo(upload_id, video, thumbnail, caption):
                    self.expose()
        return False

arjunmahishi avatar May 06 '19 17:05 arjunmahishi

@LoganHenderson The only difference is, we need to upload a thumbnail also right?

arjunmahishi avatar May 06 '19 18:05 arjunmahishi

I think it's better to use PHP code as your reference. Thank you @LoganHenderson and @arjunmahishi. It will be one of the best features in this library.

ahmdrz avatar May 07 '19 04:05 ahmdrz

@ahmdrz Do you have any docs for the Instagram rest API that you are using?

arjunmahishi avatar May 07 '19 05:05 arjunmahishi

It's a private API. So I think only Instagram developers have it. The best documents are PHP code.

ahmdrz avatar May 07 '19 06:05 ahmdrz