diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodingTempTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodingTempTask.cs
new file mode 100644
index 000000000..ad9b56535
--- /dev/null
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodingTempTask.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Tasks;
+using Microsoft.Extensions.Logging;
+
+namespace Emby.Server.Implementations.ScheduledTasks.Tasks
+{
+ ///
+ /// Deletes all transcoding temp files
+ ///
+ public class DeleteTranscodingTempTask : IScheduledTask, IConfigurableScheduledTask
+ {
+ ///
+ /// Gets or sets the application paths.
+ ///
+ /// The application paths.
+ protected ServerApplicationPaths ApplicationPaths { get; set; }
+
+
+ private readonly ILogger _logger;
+
+ private readonly IFileSystem _fileSystem;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public DeleteTranscodingTempTask(ServerApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem)
+ {
+ ApplicationPaths = appPaths;
+ _logger = logger;
+ _fileSystem = fileSystem;
+ }
+
+ ///
+ /// Creates the triggers that define when the task will run
+ ///
+ /// IEnumerable{BaseTaskTrigger}.
+ public IEnumerable GetDefaultTriggers() => new List();
+
+ ///
+ /// Returns the task to be executed
+ ///
+ /// The cancellation token.
+ /// The progress.
+ /// Task.
+ public Task Execute(CancellationToken cancellationToken, IProgress progress)
+ {
+ var minDateModified = DateTime.UtcNow.AddDays(-1);
+ progress.Report(50);
+
+ try
+ {
+ DeleteTempFilesFromDirectory(cancellationToken, ApplicationPaths.TranscodingTempPath, minDateModified, progress);
+ }
+ catch (DirectoryNotFoundException)
+ {
+ // No biggie here. Nothing to delete
+ }
+
+ return Task.CompletedTask;
+ }
+
+
+ ///
+ /// Deletes the transcoded temp files from directory with a last write time less than a given date
+ ///
+ /// The task cancellation token.
+ /// The directory.
+ /// The min date modified.
+ /// The progress.
+ private void DeleteTempFilesFromDirectory(CancellationToken cancellationToken, string directory, DateTime minDateModified, IProgress progress)
+ {
+ var filesToDelete = _fileSystem.GetFiles(directory, true)
+ .Where(f => _fileSystem.GetLastWriteTimeUtc(f) < minDateModified)
+ .ToList();
+
+ var index = 0;
+
+ foreach (var file in filesToDelete)
+ {
+ double percent = index;
+ percent /= filesToDelete.Count;
+
+ progress.Report(100 * percent);
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ DeleteFile(file.FullName);
+
+ index++;
+ }
+
+ DeleteEmptyFolders(directory);
+
+ progress.Report(100);
+ }
+
+ private void DeleteEmptyFolders(string parent)
+ {
+ foreach (var directory in _fileSystem.GetDirectoryPaths(parent))
+ {
+ DeleteEmptyFolders(directory);
+ if (!_fileSystem.GetFileSystemEntryPaths(directory).Any())
+ {
+ try
+ {
+ Directory.Delete(directory, false);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ _logger.LogError(ex, "Error deleting directory {path}", directory);
+ }
+ catch (IOException ex)
+ {
+ _logger.LogError(ex, "Error deleting directory {path}", directory);
+ }
+ }
+ }
+ }
+
+ private void DeleteFile(string path)
+ {
+ try
+ {
+ _fileSystem.DeleteFile(path);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ _logger.LogError(ex, "Error deleting file {path}", path);
+ }
+ catch (IOException ex)
+ {
+ _logger.LogError(ex, "Error deleting file {path}", path);
+ }
+ }
+
+ public string Name => "Transcoding temp cleanup";
+
+ public string Description => "Deletes transcoding temp files older than 24 hours.";
+
+ public string Category => "Maintenance";
+
+ public string Key => "DeleteTranscodingTempFiles";
+
+ public bool IsHidden => false;
+
+ public bool IsEnabled => false;
+
+ public bool IsLogged => true;
+ }
+}