diff --git a/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs b/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
index dc845b2d7e..f0cca9efd0 100644
--- a/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
+++ b/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
@@ -34,76 +34,46 @@ namespace Emby.Server.Implementations.AppBase
DataPath = Directory.CreateDirectory(Path.Combine(ProgramDataPath, "data")).FullName;
}
- ///
- /// Gets the path to the program data folder.
- ///
- /// The program data path.
+ ///
public string ProgramDataPath { get; }
///
public string WebPath { get; }
- ///
- /// Gets the path to the system folder.
- ///
- /// The path to the system folder.
+ ///
public string ProgramSystemPath { get; } = AppContext.BaseDirectory;
- ///
- /// Gets the folder path to the data directory.
- ///
- /// The data directory.
+ ///
public string DataPath { get; }
///
public string VirtualDataPath => "%AppDataPath%";
- ///
- /// Gets the image cache path.
- ///
- /// The image cache path.
+ ///
public string ImageCachePath => Path.Combine(CachePath, "images");
- ///
- /// Gets the path to the plugin directory.
- ///
- /// The plugins path.
+ ///
public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
- ///
- /// Gets the path to the plugin configurations directory.
- ///
- /// The plugin configurations path.
+ ///
public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
- ///
- /// Gets the path to the log directory.
- ///
- /// The log directory path.
+ ///
public string LogDirectoryPath { get; }
- ///
- /// Gets the path to the application configuration root directory.
- ///
- /// The configuration directory path.
+ ///
public string ConfigurationDirectoryPath { get; }
- ///
- /// Gets the path to the system configuration file.
- ///
- /// The system configuration file path.
+ ///
public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
- ///
- /// Gets or sets the folder path to the cache directory.
- ///
- /// The cache directory.
+ ///
public string CachePath { get; set; }
- ///
- /// Gets the folder path to the temp directory within the cache folder.
- ///
- /// The temp directory.
+ ///
public string TempDirectory => Path.Join(Path.GetTempPath(), "jellyfin");
+
+ ///
+ public string TrickplayPath => Path.Combine(DataPath, "trickplay");
}
}
diff --git a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
index 5d209b0afb..9c0f5b57b4 100644
--- a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
+++ b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
@@ -610,9 +610,11 @@ public class TrickplayManager : ITrickplayManager
///
public string GetTrickplayDirectory(BaseItem item, int tileWidth, int tileHeight, int width, bool saveWithMedia = false)
{
+ var basePath = _config.ApplicationPaths.TrickplayPath;
+ var idString = item.Id.ToString("N", CultureInfo.InvariantCulture);
var path = saveWithMedia
? Path.Combine(item.ContainingFolderPath, Path.ChangeExtension(item.Path, ".trickplay"))
- : Path.Combine(item.GetInternalMetadataPath(), "trickplay");
+ : Path.Combine(basePath, idString);
var subdirectory = string.Format(
CultureInfo.InvariantCulture,
diff --git a/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs b/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
index c1a9e88949..f4ebac3778 100644
--- a/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
+++ b/Jellyfin.Server/Migrations/Routines/MoveTrickplayFiles.cs
@@ -39,7 +39,7 @@ public class MoveTrickplayFiles : IMigrationRoutine
}
///
- public Guid Id => new("4EF123D5-8EFF-4B0B-869D-3AED07A60E1B");
+ public Guid Id => new("9540D44A-D8DC-11EF-9CBB-B77274F77C52");
///
public string Name => "MoveTrickplayFiles";
@@ -89,6 +89,12 @@ public class MoveTrickplayFiles : IMigrationRoutine
{
_fileSystem.MoveDirectory(oldPath, newPath);
}
+
+ oldPath = GetNewOldTrickplayDirectory(item, trickplayInfo.TileWidth, trickplayInfo.TileHeight, trickplayInfo.Width, false);
+ if (_fileSystem.DirectoryExists(oldPath))
+ {
+ _fileSystem.MoveDirectory(oldPath, newPath);
+ }
}
} while (previousCount == Limit);
@@ -101,4 +107,20 @@ public class MoveTrickplayFiles : IMigrationRoutine
return width.HasValue ? Path.Combine(path, width.Value.ToString(CultureInfo.InvariantCulture)) : path;
}
+
+ private string GetNewOldTrickplayDirectory(BaseItem item, int tileWidth, int tileHeight, int width, bool saveWithMedia = false)
+ {
+ var path = saveWithMedia
+ ? Path.Combine(item.ContainingFolderPath, Path.ChangeExtension(item.Path, ".trickplay"))
+ : Path.Combine(item.GetInternalMetadataPath(), "trickplay");
+
+ var subdirectory = string.Format(
+ CultureInfo.InvariantCulture,
+ "{0} - {1}x{2}",
+ width.ToString(CultureInfo.InvariantCulture),
+ tileWidth.ToString(CultureInfo.InvariantCulture),
+ tileHeight.ToString(CultureInfo.InvariantCulture));
+
+ return Path.Combine(path, subdirectory);
+ }
}
diff --git a/MediaBrowser.Common/Configuration/IApplicationPaths.cs b/MediaBrowser.Common/Configuration/IApplicationPaths.cs
index 57c6546675..7a8ab32361 100644
--- a/MediaBrowser.Common/Configuration/IApplicationPaths.cs
+++ b/MediaBrowser.Common/Configuration/IApplicationPaths.cs
@@ -84,5 +84,11 @@ namespace MediaBrowser.Common.Configuration
///
/// The magic string used for virtual path manipulation.
string VirtualDataPath { get; }
+
+ ///
+ /// Gets the path used for storing trickplay files.
+ ///
+ /// The trickplay path.
+ string TrickplayPath { get; }
}
}