Exemplo n.º 1
0
        public async Task <IActionResult> Create(
            [FromBody] SubmissionForm submissionForm,
            [FromServices] Channel <EditVideoMessage> channel,
            [FromServices] TemporaryFileStorage temporaryFileStorage)
        {
            if (!temporaryFileStorage.TemporaryFileExists(submissionForm.Video))
            {
                return(BadRequest());
            }

            var submission = new Submission
            {
                TrickId        = submissionForm.TrickId,
                Description    = submissionForm.Description,
                VideoProcessed = false,
                UserId         = UserId
            };

            _ctx.Add(submission);
            await _ctx.SaveChangesAsync();

            await channel.Writer.WriteAsync(new EditVideoMessage
            {
                SubmissionId = submission.Id,
                Input        = submissionForm.Video,
            });

            return(Ok(submission));
        }
Exemplo n.º 2
0
        public IActionResult DeleteTemporaryVideo(string fileName)
        {
            if (!_temporaryFileStorage.TemporaryFileExists(fileName))
            {
                return(NoContent());
            }

            _temporaryFileStorage.DeleteTemporaryFile(fileName);

            return(Ok());
        }
Exemplo n.º 3
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (await _channelReader.WaitToReadAsync(stoppingToken))
            {
                var message = await _channelReader.ReadAsync(stoppingToken);

                var inputPath           = _temporaryFileStorage.GetSavePath(message.Input);
                var outputConvertedName = TrickingLibraryConstants.Files.GenerateConvertedFileName();
                var outputThumbnailName = TrickingLibraryConstants.Files.GenerateThumbnailFileName();
                var outputConvertedPath = _temporaryFileStorage.GetSavePath(outputConvertedName);
                var outputThumbnailPath = _temporaryFileStorage.GetSavePath(outputThumbnailName);
                try
                {
                    var startInfo = new ProcessStartInfo
                    {
                        FileName        = _fileSettingsMonitor.CurrentValue.FFMPEGPath,
                        Arguments       = $"-y -i {inputPath} -an -vf scale=540x380 {outputConvertedPath} -ss 00:00:00 -vframes 1 -vf scale=540x380 {outputThumbnailPath}",
                        CreateNoWindow  = true,
                        UseShellExecute = false,
                    };

                    using (var process = new Process {
                        StartInfo = startInfo
                    })
                    {
                        process.Start();
                        process.WaitForExit();
                    }

                    if (!_temporaryFileStorage.TemporaryFileExists(outputConvertedName))
                    {
                        throw new Exception("FFMPEG failed to generate converted video");
                    }

                    if (!_temporaryFileStorage.TemporaryFileExists(outputThumbnailName))
                    {
                        throw new Exception("FFMPEG failed to generate thumbnail");
                    }

                    using (var scope = _serviceProvider.CreateScope())
                    {
                        var ctx = scope.ServiceProvider.GetRequiredService <AppDbContext>();

                        var submission = ctx.Submissions.FirstOrDefault(x => x.Id.Equals(message.SubmissionId));

                        using (var videoStream = File.Open(outputConvertedPath, FileMode.Open, FileAccess.Read))
                            using (var thumbnailStream = File.Open(outputThumbnailPath, FileMode.Open, FileAccess.Read))
                            {
                                var videoLink = _fileProvider.SaveVideoAsync(videoStream);
                                var thumbLink = _fileProvider.SaveThumbnailAsync(thumbnailStream);
                                submission.Video = new Video
                                {
                                    VideoLink = await videoLink,
                                    ThumbLink = await thumbLink,
                                };
                            }

                        submission.VideoProcessed = true;

                        await ctx.SaveChangesAsync(stoppingToken);
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Video Processing Failed for {0}", message.Input);
                }
                finally
                {
                    _temporaryFileStorage.DeleteTemporaryFile(outputConvertedName);
                    _temporaryFileStorage.DeleteTemporaryFile(outputThumbnailName);
                    _temporaryFileStorage.DeleteTemporaryFile(message.Input);
                }
            }
        }