SeasonResolver.cs 3.5 KB

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