protected override void Execute(CodeActivityContext context) { service = new TwitterService(ConsumerKey.Get(context), ConsumerSecret.Get(context), AccessToken.Get(context), AccessSecret.Get(context)); service.TraceEnabled = true; using (var stream = new FileStream(MediaPath.Get(context), FileMode.Open, FileAccess.Read, FileShare.Read)) { TwitterChunkedMedia uploadedMedia = InitialiseMediaUpload(service, stream); UploadMediaChunks(service, stream, uploadedMedia); FinializeMediaAndWaitForProcessing(service, uploadedMedia); // Now send a tweet with the media attached var twitterStatus = service.SendTweet(new SendTweetOptions() { Status = Message.Get(context), MediaIds = new string[] { uploadedMedia.MediaId.ToString() } }); //AssertResultWas(service, HttpStatusCode.OK); //Assert.IsNotNull(twitterStatus); // Capture Posted Tweet Id TweetId.Set(context, twitterStatus.Id); } }
private static void FinializeMediaAndWaitForProcessing(TwitterService service, TwitterChunkedMedia uploadedMedia) { var result = service.UploadMediaFinalize(new UploadMediaFinalizeOptions() { MediaId = uploadedMedia.MediaId }); var done = false; while (!done) { //AssertResultWas(service, HttpStatusCode.OK); if (result.ProcessingInfo.Error != null) { throw new InvalidOperationException(result.ProcessingInfo.Error.Code + " - " + result.ProcessingInfo.Error.Message); } var state = (result.ProcessingInfo?.State ?? TwitterMediaProcessingState.Succeeded); done = state == TwitterMediaProcessingState.Succeeded || state == TwitterMediaProcessingState.Failed; if (!done) { System.Threading.Thread.Sleep(Convert.ToInt32((result?.ProcessingInfo?.CheckAfterSeconds ?? 5) * 1000)); result = service.UploadMediaCheckStatus(new UploadMediaCheckStatusOptions() { MediaId = uploadedMedia.MediaId }); } } }
private static void UploadMediaChunks(TwitterService service, FileStream stream, TwitterChunkedMedia uploadedMedia) { long chunkSize = 1024 * 512; long index = 0; byte[] buffer = new byte[chunkSize]; while (stream.Position < stream.Length) { int thisChunkSize = (int)Math.Min(stream.Length - stream.Position, chunkSize); if (thisChunkSize != chunkSize) { buffer = new byte[thisChunkSize]; } stream.Read(buffer, 0, thisChunkSize); var ms = new System.IO.MemoryStream(buffer); service.UploadMediaAppend(new UploadMediaAppendOptions { MediaId = uploadedMedia.MediaId, SegmentIndex = index, Media = new MediaFile() { //FileName = "test_video.mp4", Content = ms } }); //AssertResultWas(service, HttpStatusCode.NoContent); index++; } }