Пример #1
0
        public static MediaAsset CreateInstance(VideoUploadRequest videoUploadRequest)
        {
            var uniqueId       = Guid.NewGuid();
            var uniqueIdString = uniqueId.ToString("D");
            var assetName      = $"{uniqueIdString}-{videoUploadRequest.File.FileName}";

            return(new MediaAsset
            {
                UniqueId = Guid.NewGuid(),
                FormFile = videoUploadRequest.File,
                AssetName = assetName,
                InputAssetName = $"Input-{uniqueIdString}-{videoUploadRequest.File.FileName}",
                OutputAssetName = $"Output-{uniqueIdString}-{videoUploadRequest.File.FileName}",
                JobName = $"job-{assetName}",
                LocatorName = $"locator-{assetName}",
                AssetMetaData = new AssetMetaData
                {
                    FirstName = videoUploadRequest.FirstName,
                    LastName = videoUploadRequest.LastName,
                    PhoneNumber = videoUploadRequest.PhoneNumber,
                    Street = videoUploadRequest.Street,
                    ZipCode = videoUploadRequest.ZipCode,
                    City = videoUploadRequest.City,
                    State = videoUploadRequest.State,
                    Date = videoUploadRequest.Date,
                    Time = videoUploadRequest.Time
                }
            });
        }
        public async Task <IActionResult> Video([FromForm] VideoUploadRequest videoUploadRequest)
        {
            _logger.LogInformation("Starting upload...");
            try
            {
                var result = await _azureStreamingService.UploadFileAsync(videoUploadRequest);

                return(new VideoResponse(
                           VideoUploadResponse.CreateInstanceFromAsset(result),
                           StatusCodes.Status200OK));
            }
            catch (Exception exception)
            {
                _logger.LogError("Error uploading", exception);
                var error = VideoResultError.CreateInstance(
                    "An error has occured attempting to upload the video.",
                    HttpContext,
                    ErrorType.InternalServer);

                return(new VideoResponse(error, StatusCodes.Status422UnprocessableEntity));
            }
        }
        public async Task <AssetEntity> UploadFileAsync(VideoUploadRequest videoRequest)
        {
            _logger.LogInformation("Starting Upload...");

            var mediaAsset = MediaAsset.CreateInstance(videoRequest);

            var asset = await _assetContext.GetAssetsByName(mediaAsset.AssetName);

            if (asset != null)
            {
                return(asset);
            }

            _logger.LogInformation("Creating input asset...");
            var inputAsset = await _azureMediaMethods.CreateInputAssetAsync(mediaAsset);

            _logger.LogInformation("Creating output asset...");
            var outputAsset =
                await _azureMediaMethods.CreateOutputAssetAsync(mediaAsset.InputAssetName, mediaAsset.OutputAssetName);

            if (inputAsset.Name == outputAsset.Name)
            {
                _logger.LogWarning("Input and output can't be the same.");
                return(null);
            }

            _logger.LogInformation("Creating Transform...");
            var transform = await _azureMediaMethods.GetOrCreateTransformAsync();

            _logger.LogInformation("Starting job...");

            var job = await _azureMediaMethods.SubmitJobAsync(transform.Name, mediaAsset.JobName, inputAsset.Name,
                                                              outputAsset.Name);

            var waitForJob = await _azureMediaMethods.WaitForJobToFinishAsync(transform.Name, job.Name);

            if (waitForJob.State != JobState.Finished)
            {
                _logger.LogError("The job failed to complete...");
                return(null);
            }

            //TODO: Clean up output Input Artifact


            _logger.LogInformation("Creating streaming Locator...");
            var locator =
                await _azureMediaMethods.CreateStreamingLocatorAsync(outputAsset.Name, mediaAsset.LocatorName);

            _logger.LogInformation("Obtaining streaming urls...");
            var urls = await _azureMediaMethods.GetStreamingUrlsAsync(locator.Name);

            var streamingUrls = urls.Select(url => new StreamingUrl
            {
                Url           = url,
                AssetEntityId = mediaAsset.UniqueId
            }).ToHashSet();

            mediaAsset.StreamingUrls = streamingUrls;
            _logger.LogInformation("Storing Results in database...");
            var assetEntity = await _assetContext.CreateUpdateAssetEntity(mediaAsset);

            return(assetEntity);
        }