SubtitleResolverTests.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.Collections.Generic;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using Emby.Naming.Common;
  5. using MediaBrowser.Controller;
  6. using MediaBrowser.Controller.Configuration;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.Entities.Movies;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Controller.LiveTv;
  11. using MediaBrowser.Controller.MediaEncoding;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.Globalization;
  14. using MediaBrowser.Model.IO;
  15. using MediaBrowser.Providers.MediaInfo;
  16. using Microsoft.Extensions.Logging;
  17. using Moq;
  18. using Xunit;
  19. namespace Jellyfin.Providers.Tests.MediaInfo;
  20. public class SubtitleResolverTests
  21. {
  22. private readonly SubtitleResolver _subtitleResolver;
  23. public SubtitleResolverTests()
  24. {
  25. // prep BaseItem and Video for calls made that expect managers
  26. Video.LiveTvManager = Mock.Of<ILiveTvManager>();
  27. var applicationPaths = new Mock<IServerApplicationPaths>().Object;
  28. var serverConfig = new Mock<IServerConfigurationManager>();
  29. serverConfig.Setup(c => c.ApplicationPaths)
  30. .Returns(applicationPaths);
  31. BaseItem.ConfigurationManager = serverConfig.Object;
  32. // build resolver to test with
  33. var localizationManager = Mock.Of<ILocalizationManager>();
  34. var mediaEncoder = new Mock<IMediaEncoder>(MockBehavior.Strict);
  35. mediaEncoder.Setup(me => me.GetMediaInfo(It.IsAny<MediaInfoRequest>(), It.IsAny<CancellationToken>()))
  36. .Returns<MediaInfoRequest, CancellationToken>((_, _) => Task.FromResult(new MediaBrowser.Model.MediaInfo.MediaInfo
  37. {
  38. MediaStreams = new List<MediaStream>
  39. {
  40. new()
  41. {
  42. Type = MediaStreamType.Subtitle
  43. }
  44. }
  45. }));
  46. var fileSystem = new Mock<IFileSystem>(MockBehavior.Strict);
  47. fileSystem.Setup(fs => fs.DirectoryExists(It.IsRegex(MediaInfoResolverTests.VideoDirectoryRegex)))
  48. .Returns(true);
  49. fileSystem.Setup(fs => fs.DirectoryExists(It.IsRegex(MediaInfoResolverTests.MetadataDirectoryRegex)))
  50. .Returns(true);
  51. _subtitleResolver = new SubtitleResolver(Mock.Of<ILogger<SubtitleResolver>>(), localizationManager, mediaEncoder.Object, fileSystem.Object, new NamingOptions());
  52. }
  53. [Theory]
  54. [InlineData("My.Video.srt", false, true)]
  55. [InlineData("My.Video.mp3", false, false)]
  56. [InlineData("My.Video.srt", true, true)]
  57. [InlineData("My.Video.mp3", true, false)]
  58. public async void GetExternalStreams_MixedFilenames_PicksSubtitles(string file, bool metadataDirectory, bool matches)
  59. {
  60. BaseItem.MediaSourceManager = Mock.Of<IMediaSourceManager>();
  61. var video = new Movie
  62. {
  63. Path = MediaInfoResolverTests.VideoDirectoryPath + "/My.Video.mkv"
  64. };
  65. var directoryService = MediaInfoResolverTests.GetDirectoryServiceForExternalFile(file, metadataDirectory);
  66. var streams = await _subtitleResolver.GetExternalStreamsAsync(video, 0, directoryService, false, CancellationToken.None);
  67. if (matches)
  68. {
  69. Assert.Single(streams);
  70. var actual = streams[0];
  71. Assert.Equal(MediaStreamType.Subtitle, actual.Type);
  72. }
  73. else
  74. {
  75. Assert.Empty(streams);
  76. }
  77. }
  78. }