public static async Task RunAsync( [QueueTrigger("%VIProcessingCompleteQueue%", Connection = "AzureWebJobsStorage")] CloudQueueMessage myQueueItem, TraceWriter log) { var videoIndexerHelper = new VideoIndexerHelper(log); var cosmosHelper = new CosmosHelper(log); var queueContents = myQueueItem.AsString; // queue item should be id & state var completionData = JsonConvert.DeserializeObject <Dictionary <string, string> >(queueContents); // ignore if not proper state if (completionData["state"] != "Processed") { return; } var videoIndexerVideoId = completionData["id"]; var apiUrl = videoIndexerHelper.VideoIndexerApiUrl; var client = videoIndexerHelper.GetVideoIndexerHttpClient(); var uri = string.Format(apiUrl + "/{0}", videoIndexerVideoId); videoIndexerHelper.LogMessage($" call VI with uri{uri}"); var response = await client.GetAsync(uri); var json = await response.Content.ReadAsStringAsync(); videoIndexerHelper.LogMessage($"get state with id: {videoIndexerVideoId}"); var state = cosmosHelper.GetManifestStateRecordByVideoId(videoIndexerVideoId, log); videoIndexerHelper.LogMessage("create poco from json "); var videoBreakdownPoco = JsonConvert.DeserializeObject <VideoBreakdown>(json); var taskList = new List <Task>(); // these tasks are network io dependant and can happen in parallel //TODO: setup default languages to be pulled from app settings, but //TODO: the languages set in config would override //TODO: validate languages videoIndexerHelper.LogMessage("Process transcripts"); if (state.Transcripts != null) { taskList = state.Transcripts .Select(language => GetCaptionsVttAsync(videoIndexerVideoId, videoBreakdownPoco, language, videoIndexerHelper)) .ToList(); } videoIndexerHelper.LogMessage("start task extract images"); taskList.Add(ExtractImages(videoBreakdownPoco, log, videoIndexerHelper)); //var englishCaptionsTask = GetCaptionsVttAsync(videoIndexerVideoId, videoBreakdownPoco, "English"); //var japaneseCaptionsTask = GetCaptionsVttAsync(videoIndexerVideoId, videoBreakdownPoco, "Japanese"); //var imagesTask = ExtractImages(videoBreakdownPoco); videoIndexerHelper.LogMessage($"wait for tasks to finish"); await Task.WhenAll(taskList.ToArray()); videoIndexerHelper.LogMessage($"store in json breakdowns"); // we wait to store breakdown json because it's modified in previous tasks var storeTask1 = StoreBreakdownJsonInCosmos(videoBreakdownPoco, log); videoIndexerHelper.LogMessage($"update processing "); var storeTask2 = cosmosHelper.UpdateProcessingStateAsync(completionData["id"]); videoIndexerHelper.LogMessage($"wait for store tasks to finish"); await Task.WhenAll(storeTask1, storeTask2); }