private async Task <Result <bool> > ConfigureVideo(Action <UploaderProgress> progress, UploaderProgress upProgress, string uploadId, bool isDirectVideo, bool isDisappearingVideo, string caption, VisualMediaViewMode viewMode, InstaStoryType storyType, string recipients, string threadId, Uri uri, StoryUploadOptions uploadOptions = null) { try { upProgress.UploadState = InstaUploadState.Configuring; progress?.Invoke(upProgress); var instaUri = UriCreator.GetDirectConfigVideoUri(); var retryContext = GetRetryContext(); var clientContext = Guid.NewGuid().ToString(); if (isDirectVideo) { var data = new Dictionary <string, string> { { "action", "send_item" }, { "client_context", clientContext }, { "_csrftoken", Session.CsrfToken }, { "video_result", "" }, { "_uuid", Device.Uuid.ToString() }, { "upload_id", uploadId } }; if (!string.IsNullOrEmpty(recipients)) { data.Add("recipient_users", $"[[{recipients}]]"); } else { data.Add("thread_ids", $"[{threadId}]"); } instaUri = UriCreator.GetDirectConfigVideoUri(); var request = new HttpRequestMessage(HttpMethod.Post, instaUri); request.Content = new HttpFormUrlEncodedContent(data); request.Headers.Add("retry_context", retryContext); var response = await _httpClient.SendRequestAsync(request); var json = await response.Content.ReadAsStringAsync(); DebugLogger.LogResponse(response); if (response.StatusCode != HttpStatusCode.Ok) { upProgress.UploadState = InstaUploadState.Error; progress?.Invoke(upProgress); return(Result <bool> .Fail(json, response.ReasonPhrase)); } var obj = JsonConvert.DeserializeObject <DefaultResponse>(json); if (obj.Status.ToLower() == "ok") { upProgress.UploadState = InstaUploadState.Configured; progress?.Invoke(upProgress); } else { upProgress.UploadState = InstaUploadState.Completed; progress?.Invoke(upProgress); } return(obj.IsOk() ? Result <bool> .Success(true, json, obj.Message) : Result <bool> .Fail(json, obj.Message)); } else { var rnd = new Random(); var data = new JObject { { "filter_type", "0" }, { "timezone_offset", "16200" }, { "_csrftoken", Session.CsrfToken }, { "client_shared_at", (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - rnd.Next(25, 55)).ToString() }, { "story_media_creation_date", (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - rnd.Next(50, 70)).ToString() }, { "media_folder", "Camera" }, { "source_type", "4" }, { "video_result", "" }, { "_uid", Session.LoggedInUser.Pk.ToString() }, { "_uuid", Device.Uuid.ToString() }, { "caption", caption ?? string.Empty }, { "date_time_original", DateTimeOffset.Now.ToString("yyyy-dd-MMTh:mm:ss-0fffZ") }, { "capture_type", "normal" }, { "mas_opt_in", "NOT_PROMPTED" }, { "upload_id", uploadId }, { "client_timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() }, { "device", new JObject { { "manufacturer", Device.HardwareManufacturer }, { "model", Device.HardwareModel }, { "android_release", Device.AndroidVersion.VersionNumber }, { "android_version", Device.AndroidVersion.APILevel } } }, { "length", 0 }, { "extra", new JObject { { "source_width", 0 }, { "source_height", 0 } } }, { "audio_muted", false }, { "poster_frame_index", 0 }, }; if (isDisappearingVideo) { data.Add("view_mode", viewMode.ToString().ToLower()); data.Add("configure_mode", "2"); data.Add("recipient_users", "[]"); data.Add("thread_ids", $"[{threadId}]"); } else { switch (storyType) { case InstaStoryType.SelfStory: default: data.Add("configure_mode", "1"); break; case InstaStoryType.Direct: data.Add("configure_mode", "2"); data.Add("view_mode", "replayable"); data.Add("recipient_users", "[]"); data.Add("thread_ids", $"[{threadId}]"); break; case InstaStoryType.Both: data.Add("configure_mode", "3"); data.Add("view_mode", "replayable"); data.Add("recipient_users", "[]"); data.Add("thread_ids", $"[{threadId}]"); break; } if (uri != null) { var webUri = new JArray { new JObject { { "webUri", uri.ToString() } } }; var storyCta = new JArray { new JObject { { "links", webUri } } }; data.Add("story_cta", storyCta.ToString(Formatting.None)); } if (uploadOptions != null) { if (uploadOptions.Hashtags?.Count > 0) { var hashtagArr = new JArray(); foreach (var item in uploadOptions.Hashtags) { hashtagArr.Add(item.ToJson()); } data.Add("story_hashtags", hashtagArr.ToString(Formatting.None)); } if (uploadOptions.Locations?.Count > 0) { var locationArr = new JArray(); foreach (var item in uploadOptions.Locations) { locationArr.Add(item.ToJson()); } data.Add("story_locations", locationArr.ToString(Formatting.None)); } if (uploadOptions.Slider != null) { var sliderArr = new JArray { uploadOptions.Slider.ToJson() }; data.Add("story_sliders", sliderArr.ToString(Formatting.None)); if (uploadOptions.Slider.IsSticker) { data.Add("story_sticker_ids", $"emoji_slider_{uploadOptions.Slider.Emoji}"); } } else { if (uploadOptions.Polls?.Count > 0) { var pollArr = new JArray(); foreach (var item in uploadOptions.Polls) { pollArr.Add(item.ToJson()); } data.Add("story_polls", pollArr.ToString(Formatting.None)); } if (uploadOptions.Questions?.Count > 0) { var questionArr = new JArray(); foreach (var item in uploadOptions.Questions) { questionArr.Add(item.ToJson()); } data.Add("story_questions", questionArr.ToString(Formatting.None)); } } if (uploadOptions.Countdown != null) { var countdownArr = new JArray { uploadOptions.Countdown.ToJson() }; data.Add("story_countdowns", countdownArr.ToString(Formatting.None)); data.Add("story_sticker_ids", "countdown_sticker_time"); } } } instaUri = UriCreator.GetVideoStoryConfigureUri(true); var request = GetSignedRequest(instaUri, data); request.Headers.Add("retry_context", retryContext); var response = await _httpClient.SendRequestAsync(request); var json = await response.Content.ReadAsStringAsync(); DebugLogger.LogResponse(response); if (response.IsSuccessStatusCode) { var mediaResponse = JsonConvert.DeserializeObject <DefaultResponse>(json); if (mediaResponse.IsOk()) { upProgress.UploadState = InstaUploadState.Configured; progress?.Invoke(upProgress); } else { upProgress.UploadState = InstaUploadState.Completed; progress?.Invoke(upProgress); } return(mediaResponse.IsOk() ? Result <bool> .Success(true) : Result <bool> .Fail(json, mediaResponse.Message)); } upProgress.UploadState = InstaUploadState.Error; progress?.Invoke(upProgress); return(Result <bool> .Fail(json, response.ReasonPhrase)); } } catch (Exception exception) { upProgress.UploadState = InstaUploadState.Error; progress?.Invoke(upProgress); DebugLogger.LogException(exception); return(Result <bool> .Except(exception)); } }