Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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);
            }
        }
Ejemplo n.º 3
0
        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);
        }