SeasonResolver.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #nullable disable
  2. using System.Globalization;
  3. using Emby.Naming.TV;
  4. using MediaBrowser.Controller.Entities.TV;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Model.Globalization;
  7. using Microsoft.Extensions.Logging;
  8. namespace Emby.Server.Implementations.Library.Resolvers.TV
  9. {
  10. /// <summary>
  11. /// Class SeasonResolver.
  12. /// </summary>
  13. public class SeasonResolver : FolderResolver<Season>
  14. {
  15. private readonly ILibraryManager _libraryManager;
  16. private readonly ILocalizationManager _localization;
  17. private readonly ILogger<SeasonResolver> _logger;
  18. /// <summary>
  19. /// Initializes a new instance of the <see cref="SeasonResolver"/> class.
  20. /// </summary>
  21. /// <param name="libraryManager">The library manager.</param>
  22. /// <param name="localization">The localization.</param>
  23. /// <param name="logger">The logger.</param>
  24. public SeasonResolver(
  25. ILibraryManager libraryManager,
  26. ILocalizationManager localization,
  27. ILogger<SeasonResolver> logger)
  28. {
  29. _libraryManager = libraryManager;
  30. _localization = localization;
  31. _logger = logger;
  32. }
  33. /// <summary>
  34. /// Resolves the specified args.
  35. /// </summary>
  36. /// <param name="args">The args.</param>
  37. /// <returns>Season.</returns>
  38. protected override Season Resolve(ItemResolveArgs args)
  39. {
  40. if (args.Parent is Series series && args.IsDirectory)
  41. {
  42. var namingOptions = ((LibraryManager)_libraryManager).GetNamingOptions();
  43. var path = args.Path;
  44. var seasonParserResult = SeasonPathParser.Parse(path, true, true);
  45. var season = new Season
  46. {
  47. IndexNumber = seasonParserResult.SeasonNumber,
  48. SeriesId = series.Id,
  49. SeriesName = series.Name
  50. };
  51. if (!season.IndexNumber.HasValue || !seasonParserResult.IsSeasonFolder)
  52. {
  53. var resolver = new Naming.TV.EpisodeResolver(namingOptions);
  54. var folderName = System.IO.Path.GetFileName(path);
  55. var testPath = "\\\\test\\" + folderName;
  56. var episodeInfo = resolver.Resolve(testPath, true);
  57. if (episodeInfo != null)
  58. {
  59. if (episodeInfo.EpisodeNumber.HasValue && episodeInfo.SeasonNumber.HasValue)
  60. {
  61. _logger.LogDebug(
  62. "Found folder underneath series with episode number: {0}. Season {1}. Episode {2}",
  63. path,
  64. episodeInfo.SeasonNumber.Value,
  65. episodeInfo.EpisodeNumber.Value);
  66. return null;
  67. }
  68. }
  69. }
  70. if (season.IndexNumber.HasValue)
  71. {
  72. var seasonNumber = season.IndexNumber.Value;
  73. season.Name = seasonNumber == 0 ?
  74. args.LibraryOptions.SeasonZeroDisplayName :
  75. string.Format(
  76. CultureInfo.InvariantCulture,
  77. _localization.GetLocalizedString("NameSeasonNumber"),
  78. seasonNumber,
  79. args.LibraryOptions.PreferredMetadataLanguage);
  80. }
  81. return season;
  82. }
  83. return null;
  84. }
  85. }
  86. }