public void TestMatroskaBinaryAttachmentInfo() { // Arrange MatroskaBinaryReader matroskaInfoReader = GetMatroskaBinaryFileReader(); // Act matroskaInfoReader.ReadAttachmentsAsync().Wait(); // Assert Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("cover.").Result.Length > 0); Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("banner.").Result.Length > 0); Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("poster.").Result.Length > 0); Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("fanart.").Result.Length > 0); Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("clearart.").Result.Length > 0); Assert.IsTrue(matroskaInfoReader.GetAttachmentByNameAsync("clearlogo.").Result.Length > 0); }
/// <summary> /// Reads all mkv tag images and caches them in the <see cref="IFanArtCache"/> service. /// </summary> /// <param name="lfsra"><see cref="ILocalFsResourceAccessor>"/> for the file.</param> /// <param name="mediaItemId">Id of the media item.</param> /// <param name="title">Title of the media item.</param> /// <returns><see cref="Task"/> that completes when the images have been cached.</returns> protected async Task ExtractMkvFanArt(ILocalFsResourceAccessor lfsra, Guid mediaItemId, string title) { if (lfsra == null) { return; } MatroskaBinaryReader mkvReader = new MatroskaBinaryReader(lfsra); IFanArtCache fanArtCache = ServiceRegistration.Get <IFanArtCache>(); foreach (var pattern in MKV_PATTERNS) { byte[] binaryData = await mkvReader.GetAttachmentByNameAsync(pattern.Item1).ConfigureAwait(false); if (binaryData == null) { continue; } string filename = pattern + Path.GetFileNameWithoutExtension(lfsra.LocalFileSystemPath); await fanArtCache.TrySaveFanArt(mediaItemId, title, pattern.Item2, p => TrySaveFileImage(binaryData, p, filename)).ConfigureAwait(false); } }
public bool TryGetFanArt(string mediaType, string fanArtType, string name, int maxWidth, int maxHeight, bool singleRandom, out IList <FanArtImage> result) { result = null; Guid mediaItemId; if (!Guid.TryParse(name, out mediaItemId)) { return(false); } IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>(false); if (mediaLibrary == null) { return(false); } IFilter filter = new MediaItemIdFilter(mediaItemId); IList <MediaItem> items = mediaLibrary.Search(new MediaItemQuery(NECESSARY_MIAS, filter), false, null, true); if (items == null || items.Count == 0) { return(false); } MediaItem mediaItem = items.First(); // Virtual resources won't have any local fanart if (mediaItem.IsVirtual) { return(false); } var resourceLocator = mediaItem.GetResourceLocator(); string fileSystemPath = string.Empty; IList <string> patterns = new List <string>(); switch (fanArtType) { case FanArtTypes.Banner: patterns.Add("banner."); break; case FanArtTypes.ClearArt: patterns.Add("clearart."); break; case FanArtTypes.Poster: case FanArtTypes.Thumbnail: patterns.Add("cover."); patterns.Add("poster."); patterns.Add("folder."); break; case FanArtTypes.FanArt: patterns.Add("backdrop."); patterns.Add("fanart."); break; case FanArtTypes.Logo: patterns.Add("clearlogo."); break; default: return(false); } // File based access try { using (var accessor = resourceLocator?.CreateAccessor()) { ILocalFsResourceAccessor fsra = accessor as ILocalFsResourceAccessor; if (fsra != null) { var ext = Path.GetExtension(fsra.LocalFileSystemPath); if (!SUPPORTED_EXTENSIONS.Contains(ext)) { return(false); } MatroskaBinaryReader mkvReader = new MatroskaBinaryReader(fsra); foreach (string pattern in patterns) { byte[] binaryData = mkvReader.GetAttachmentByNameAsync(pattern).Result; if (binaryData != null) { result = new List <FanArtImage> { new FanArtImage(name, binaryData) }; return(true); } } } } } catch (Exception ex) { ServiceRegistration.Get <ILogger>().Warn("MkvAttachmentsProvider: Exception while reading mkv attachment of type '{0}' from '{1}'", ex, fanArtType, fileSystemPath); } return(false); }