/// <summary> /// Executes the actual media conversion, returning an object that contains settings and the /// results of the conversion. /// </summary> /// <param name="mediaObject">The media object.</param> /// <param name="encoderSetting">The encoder setting that defines the conversion parameters.</param> /// <returns> /// Returns an instance of <see cref="MediaConversionSettings"/> containing settings and /// results used in the conversion. /// </returns> /// <exception cref="ArgumentNullException">Thrown when <paramref name="mediaObject" /> or /// <paramref name="encoderSetting" /> is null.</exception> private MediaConversionSettings ExecuteMediaConversion(IGalleryObject mediaObject, IMediaEncoderSettings encoderSetting) { if (mediaObject == null) { throw new ArgumentNullException("mediaObject"); } if (encoderSetting == null) { throw new ArgumentNullException("encoderSetting"); } AttemptedEncoderSettings.Add(encoderSetting); IGallerySettings gallerySetting = Factory.LoadGallerySetting(mediaObject.GalleryId); // Determine file name and path of the new file. string optimizedPath = HelperFunctions.MapAlbumDirectoryStructureToAlternateDirectory(mediaObject.Original.FileInfo.DirectoryName, gallerySetting.FullOptimizedPath, gallerySetting.FullMediaObjectPath); string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(mediaObject.Original.FileInfo.Name); string newFilename = GenerateNewFilename(optimizedPath, fileNameWithoutExtension, encoderSetting.DestinationFileExtension, gallerySetting.OptimizedFileNamePrefix); string newFilePath = Path.Combine(optimizedPath, newFilename); MediaConversionSettings mediaSettings = new MediaConversionSettings { FilePathSource = mediaObject.Original.FileNamePhysicalPath, FilePathDestination = newFilePath, EncoderSetting = encoderSetting, GalleryId = mediaObject.GalleryId, MediaQueueId = _currentMediaQueueItemId, TimeoutMs = gallerySetting.MediaEncoderTimeoutMs, MediaObjectId = mediaObject.Id, FFmpegArgs = String.Empty, FFmpegOutput = String.Empty, CancellationToken = CancelTokenSource.Token }; mediaSettings.FFmpegOutput = FFmpeg.CreateMedia(mediaSettings); mediaSettings.FileCreated = ValidateFile(mediaSettings.FilePathDestination); if (!mediaSettings.FileCreated) { // Could not create the requested version of the file. Record the event, then try again, // using the next encoder setting (if one exists). string msg = String.Format(CultureInfo.CurrentCulture, "FAILURE: FFmpeg was not able to create video '{0}'.", Path.GetFileName(mediaSettings.FilePathDestination)); RecordEvent(msg, mediaSettings); IMediaEncoderSettings nextEncoderSetting = GetEncoderSetting(mediaObject); if (nextEncoderSetting != null) { return(ExecuteMediaConversion(mediaObject, nextEncoderSetting)); } } return(mediaSettings); }
/// <summary> /// Update settings to prepare for the conversion of a media item. /// </summary> private void Reset() { _currentMediaQueueItemId = int.MinValue; AttemptedEncoderSettings.Clear(); // Update the status of any 'Processing' items to 'Waiting'. This is needed to reset any items that // were being processed but were never finished (this can happen if the app pool recycles). foreach (var item in MediaQueueItemDictionary.Where(m => m.Value.Status == MediaQueueItemStatus.Processing).Select(m => m.Value)) { ChangeStatus(item, MediaQueueItemStatus.Waiting); } }
/// <summary> /// Gets the encoder setting to use for processing the <paramref name="mediaObject" />. /// If more than one encoder setting is applicable, this function automatically returns /// the first item that has not yet been tried. If no items are applicable, returns /// null. /// </summary> /// <param name="mediaObject">The media object.</param> /// <returns>An instance of <see cref="IMediaEncoderSettings" /> or null.</returns> private IMediaEncoderSettings GetEncoderSetting(IGalleryObject mediaObject) { var encoderSettings = GetEncoderSettings(mediaObject.Original.MimeType, mediaObject.GalleryId); foreach (IMediaEncoderSettings encoderSetting in encoderSettings) { if (!AttemptedEncoderSettings.Any(es => es.Sequence == encoderSetting.Sequence)) { return(encoderSetting); } } return(null); }
/// <summary> /// Gets the encoder setting to use for processing the <paramref name="mediaObject" />. /// If more than one encoder setting is applicable, this function automatically returns /// the first item that has not yet been tried. If no items are applicable, returns /// null. /// </summary> /// <param name="mediaObject">The media object.</param> /// <returns>An instance of <see cref="IMediaEncoderSettings" /> or null.</returns> private IMediaEncoderSettings GetEncoderSetting(IGalleryObject mediaObject) { var encoderSettings = GetEncoderSettings(mediaObject.Original.MimeType, mediaObject.GalleryId); return(encoderSettings.FirstOrDefault(encoderSetting => AttemptedEncoderSettings.All(es => es.Sequence != encoderSetting.Sequence))); }