public async Task Preview(int recordingId) { // get recording var recording = await _context.Recordings .Include(x => x.Chapters) .Include(x => x.Outputs) .FirstOrDefaultAsync(x => x.Id == recordingId); if (recording == null) { return; } // create new recording output var recordingOutput = new RecordingOutput() { RecordingId = recordingId, DateStarted = DateTime.Now, Status = RecordingStatus.PROCESSING, JobType = typeof(PreviewRecordingJob).FullName, JobConfiguration = null }; _context.RecordingOutputs.Add(recordingOutput); await _context.SaveChangesAsync(); await UpdateLectureRecordingStatus(); // get lecture var lecture = await _context.Lectures .FindAsync(recording.LectureId); // start encoding preview if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING || recording.Type == RecordingType.SIMPLE_RECORDING || recording.Type == RecordingType.ZOOM_RECORDING) { // file path is file? string outputFolder = Path.Combine(lecture.ConvertedPath, recording.Id.ToString(), "preview"); string inputFileName = ""; if (File.Exists(recording.FilePath)) { inputFileName = recording.FilePath; } else if (recording.Type == RecordingType.ZOOM_RECORDING) { inputFileName = Directory.GetFiles(recording.FilePath) .Where(x => x.EndsWith(".mp4")) .SingleOrDefault(); } else { var targetName = recording.CustomTargetName != null ? recording.CustomTargetName : ""; inputFileName = Directory.GetFiles(recording.FilePath) .Where(x => x.EndsWith(targetName + "_meta.json")) .SingleOrDefault(); } if (inputFileName == null) { throw new Exception("Could not find studio meta data."); } // convert files RecordingMetadata metaData = null; if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING) { metaData = ConvertStudioRecording(inputFileName, outputFolder); recording.Duration = metaData.Duration; } else if (recording.Type == RecordingType.SIMPLE_RECORDING) { metaData = ConvertSimpleRecording(inputFileName, outputFolder); recording.Duration = metaData.Duration; } else if (recording.Type == RecordingType.ZOOM_RECORDING) { metaData = ConvertZoomRecording(inputFileName, outputFolder); recording.Duration = metaData.Duration; } if (metaData != null) { _context.RecordingChapters.RemoveRange(recording.Chapters); // add slides foreach (var slide in metaData.Slides) { var chapter = new RecordingChapter() { Recording = recording, StartPosition = slide.StartPosition, Text = slide.Ocr, Thumbnail = slide.Thumbnail }; _context.RecordingChapters.Add(chapter); } } // set status recordingOutput.Status = RecordingStatus.PROCESSED; recordingOutput.JobError = null; recordingOutput.DateFinished = DateTime.Now; await _context.SaveChangesAsync(); await UpdateLectureRecordingStatus(); } }
public async Task Execute(ProcessRecordingJobConfiguration configuration) { // get recording var recording = await _context.Recordings .Include(x => x.Chapters) .Include(x => x.Outputs) .FirstOrDefaultAsync(x => x.Id == configuration.RecordingId); if (recording == null) { return; } // create new recording output var recordingOutput = new RecordingOutput() { RecordingId = configuration.RecordingId, DateStarted = DateTime.Now, Status = RecordingStatus.PROCESSING, JobType = typeof(ProcessRecordingJob).FullName, JobConfiguration = JsonConvert.SerializeObject(configuration) }; _context.RecordingOutputs.Add(recordingOutput); await _context.SaveChangesAsync(); await UpdateLectureRecordingStatus(); // get lecture var lecture = await _context.Lectures .FindAsync(recording.LectureId); // start encoding if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING || recording.Type == RecordingType.SIMPLE_RECORDING || recording.Type == RecordingType.ZOOM_RECORDING) { // file path is file? string outputFolder = Path.Combine(lecture.ConvertedPath, recording.Id.ToString(), "output_" + recordingOutput.Id); string inputFileName = ""; if (File.Exists(recording.FilePath)) { inputFileName = recording.FilePath; } else if (recording.Type == RecordingType.ZOOM_RECORDING) { inputFileName = Directory.GetFiles(recording.FilePath) .Where(x => x.EndsWith(".mp4")) .SingleOrDefault(); } else { string targetName = recording.CustomTargetName != null ? recording.CustomTargetName : ""; inputFileName = Directory.GetFiles(recording.FilePath) .Where(x => x.EndsWith(targetName + "_meta.json")) .SingleOrDefault(); } // create output directory Directory.CreateDirectory(outputFolder); if (inputFileName == null) { recordingOutput.Status = RecordingStatus.ERROR; recordingOutput.JobError = "Could not find studio meta data."; await _context.SaveChangesAsync(); await UpdateLectureRecordingStatus(); throw new Exception("Could not find studio meta data."); } try { // convert files RecordingMetadata metaData = null; if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING) { metaData = ConvertStudioRecording(inputFileName, outputFolder, GetDimension(configuration.OutputType)); } else if (recording.Type == RecordingType.SIMPLE_RECORDING) { metaData = ConvertSimpleRecording(inputFileName, outputFolder, GetDimension(configuration.OutputType)); } else if (recording.Type == RecordingType.ZOOM_RECORDING) { metaData = ConvertZoomRecording(inputFileName, outputFolder); } recordingOutput.Status = RecordingStatus.PROCESSED; recordingOutput.JobError = null; recordingOutput.DateFinished = DateTime.Now; await _context.SaveChangesAsync(); await UpdateLectureRecordingStatus(); } catch (Exception ex) { recordingOutput.Status = RecordingStatus.ERROR; recordingOutput.JobError = ex.Message; recordingOutput.DateFinished = DateTime.Now; await UpdateLectureRecordingStatus(); throw ex; } } }