コード例 #1
0
        private static async Task GetCaptionsVttAsync(string id, VideoBreakdown videoBreakdownPoco, string language, VideoIndexerHelper videoIndexerHelper)
        {
            var client      = videoIndexerHelper.GetVideoIndexerHttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request parameters
            queryString["language"] = language;
            var uri = $"https://videobreakdown.azure-api.net/Breakdowns/Api/Partner/Breakdowns/{id}/VttUrl?" +
                      queryString;

            // this returns a url to the captions file
            var response = await client.GetAsync(uri);

            var vttUrl =
                response.Content.ReadAsStringAsync().Result
                .Replace("\"", "");     // seems like the url is always wrapped in quotes

            // download actual vtt file and store in blob storage
            var vttStream = await DownloadWebResource(vttUrl);

            await UploadFileToBlobStorage(vttStream, $"{videoBreakdownPoco.id}/{language}.vtt", "text/plain", videoIndexerHelper);

            //TODO: put reference to vtt in breakdown?
        }
コード例 #2
0
        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);
        }