PathManager.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using MediaBrowser.Common.Configuration;
  6. using MediaBrowser.Controller.Configuration;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.IO;
  9. namespace Emby.Server.Implementations.Library;
  10. /// <summary>
  11. /// IPathManager implementation.
  12. /// </summary>
  13. public class PathManager : IPathManager
  14. {
  15. private readonly IServerConfigurationManager _config;
  16. private readonly IApplicationPaths _appPaths;
  17. /// <summary>
  18. /// Initializes a new instance of the <see cref="PathManager"/> class.
  19. /// </summary>
  20. /// <param name="config">The server configuration manager.</param>
  21. /// <param name="appPaths">The application paths.</param>
  22. public PathManager(
  23. IServerConfigurationManager config,
  24. IApplicationPaths appPaths)
  25. {
  26. _config = config;
  27. _appPaths = appPaths;
  28. }
  29. private string SubtitleCachePath => Path.Combine(_appPaths.DataPath, "subtitles");
  30. private string AttachmentCachePath => Path.Combine(_appPaths.DataPath, "attachments");
  31. /// <inheritdoc />
  32. public string GetAttachmentPath(string mediaSourceId, string fileName)
  33. {
  34. return Path.Combine(GetAttachmentFolderPath(mediaSourceId), fileName);
  35. }
  36. /// <inheritdoc />
  37. public string GetAttachmentFolderPath(string mediaSourceId)
  38. {
  39. var id = Guid.Parse(mediaSourceId).ToString("D", CultureInfo.InvariantCulture).AsSpan();
  40. return Path.Join(AttachmentCachePath, id[..2], id);
  41. }
  42. /// <inheritdoc />
  43. public string GetSubtitleFolderPath(string mediaSourceId)
  44. {
  45. var id = Guid.Parse(mediaSourceId).ToString("D", CultureInfo.InvariantCulture).AsSpan();
  46. return Path.Join(SubtitleCachePath, id[..2], id);
  47. }
  48. /// <inheritdoc />
  49. public string GetSubtitlePath(string mediaSourceId, int streamIndex, string extension)
  50. {
  51. return Path.Combine(GetSubtitleFolderPath(mediaSourceId), streamIndex.ToString(CultureInfo.InvariantCulture) + extension);
  52. }
  53. /// <inheritdoc />
  54. public string GetTrickplayDirectory(BaseItem item, bool saveWithMedia = false)
  55. {
  56. var id = item.Id.ToString("D", CultureInfo.InvariantCulture).AsSpan();
  57. return saveWithMedia
  58. ? Path.Combine(item.ContainingFolderPath, Path.ChangeExtension(Path.GetFileName(item.Path), ".trickplay"))
  59. : Path.Join(_config.ApplicationPaths.TrickplayPath, id[..2], id);
  60. }
  61. /// <inheritdoc/>
  62. public string GetChapterImageFolderPath(BaseItem item)
  63. {
  64. return Path.Combine(item.GetInternalMetadataPath(), "chapters");
  65. }
  66. /// <inheritdoc/>
  67. public string GetChapterImagePath(BaseItem item, long chapterPositionTicks)
  68. {
  69. var filename = item.DateModified.Ticks.ToString(CultureInfo.InvariantCulture) + "_" + chapterPositionTicks.ToString(CultureInfo.InvariantCulture) + ".jpg";
  70. return Path.Combine(GetChapterImageFolderPath(item), filename);
  71. }
  72. /// <inheritdoc/>
  73. public IReadOnlyList<string> GetExtractedDataPaths(BaseItem item)
  74. {
  75. var mediaSourceId = item.Id.ToString("N", CultureInfo.InvariantCulture);
  76. return [
  77. GetAttachmentFolderPath(mediaSourceId),
  78. GetSubtitleFolderPath(mediaSourceId),
  79. GetTrickplayDirectory(item, false),
  80. GetTrickplayDirectory(item, true),
  81. GetChapterImageFolderPath(item)
  82. ];
  83. }
  84. }