Example #1
0
        public VideoPlayerForComSkipTests(string zipResource)
        {
            _zipResource = zipResource;
            string testDataDir = TestContext.CurrentContext.TestDirectory + "\\VideoPlayers\\ComSkip\\TestData\\";

            _localRsAccessor = new LocalFsResourceAccessor(_localRsProvider, "/" + Path.Combine(testDataDir, _zipResource + ".zip"));
        }
Example #2
0
        public void TestExtractThumbnail()
        {
            // Arrange
            string testFileName            = "Test Media.mkv";
            string testDataDir             = TestContext.CurrentContext.TestDirectory + "\\VideoThumbnailer\\TestData\\";
            ILocalFsResourceAccessor lfsra = new LocalFsResourceAccessor(new LocalFsResourceProvider(), "/" + Path.Combine(testDataDir, testFileName));

            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MultipleMediaItemAspect videoStreamAspect            = new MultipleMediaItemAspect(VideoStreamAspect.Metadata);

            videoStreamAspect.SetAttribute(VideoStreamAspect.ATTR_RESOURCE_INDEX, 0);
            videoStreamAspect.SetAttribute(VideoStreamAspect.ATTR_STREAM_INDEX, 1);
            videoStreamAspect.SetAttribute(VideoStreamAspect.ATTR_DURATION, (long)1);
            videoStreamAspect.SetAttribute(VideoStreamAspect.ATTR_WIDTH, 1076);
            videoStreamAspect.SetAttribute(VideoStreamAspect.ATTR_HEIGHT, 1916);
            MediaItemAspect.AddOrUpdateAspect(aspects, videoStreamAspect);
            MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_INDEX, 0);
            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_TYPE, ProviderResourceAspect.TYPE_PRIMARY);
            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, lfsra.CanonicalLocalResourcePath.Serialize());
            MediaItemAspect.AddOrUpdateAspect(aspects, resourceAspect);

            // Act
            bool success = new OCVVideoThumbnailer().TryExtractMetadataAsync(lfsra, aspects, false).Result;

            // Assert
            Assert.IsTrue(success);
            Assert.IsTrue(aspects.ContainsKey(ThumbnailLargeAspect.ASPECT_ID));
        }
        private MatroskaBinaryReader GetMatroskaBinaryFileReader()
        {
            string testFileName            = "Test Media.mkv";
            string testDataDir             = TestContext.CurrentContext.TestDirectory + "\\Libraries\\MatroskaLib\\TestData\\";
            ILocalFsResourceAccessor lfsra = new LocalFsResourceAccessor(new LocalFsResourceProvider(), "/" + Path.Combine(testDataDir, testFileName));

            return(new MatroskaBinaryReader(lfsra));
        }
        protected int FindExternalSubtitles(ILocalFsResourceAccessor lfsra, IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData)
        {
            int subtitleCount = 0;

            try
            {
                IList <MultipleMediaItemAspect> providerResourceAspects;
                if (!MediaItemAspect.TryGetAspects(extractedAspectData, ProviderResourceAspect.Metadata, out providerResourceAspects))
                {
                    return(0);
                }

                int newResourceIndex = -1;
                foreach (MultipleMediaItemAspect providerResourceAspect in providerResourceAspects)
                {
                    int resouceIndex = providerResourceAspect.GetAttributeValue <int>(ProviderResourceAspect.ATTR_RESOURCE_INDEX);
                    if (newResourceIndex < resouceIndex)
                    {
                        newResourceIndex = resouceIndex;
                    }
                }
                newResourceIndex++;

                using (lfsra.EnsureLocalFileSystemAccess())
                {
                    foreach (MultipleMediaItemAspect mmia in providerResourceAspects)
                    {
                        string       accessorPath = (string)mmia.GetAttributeValue(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH);
                        ResourcePath resourcePath = ResourcePath.Deserialize(accessorPath);

                        if (mmia.GetAttributeValue <int>(ProviderResourceAspect.ATTR_TYPE) != ProviderResourceAspect.TYPE_PRIMARY)
                        {
                            continue;
                        }

                        string filePath = LocalFsResourceProviderBase.ToDosPath(resourcePath);
                        if (string.IsNullOrEmpty(filePath))
                        {
                            continue;
                        }

                        List <string> subs = new List <string>();
                        int           videoResouceIndex = (int)mmia.GetAttributeValue(ProviderResourceAspect.ATTR_RESOURCE_INDEX);
                        string[]      subFiles          = Directory.GetFiles(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "*.*");
                        if (subFiles != null)
                        {
                            subs.AddRange(subFiles);
                        }
                        foreach (string folder in SUBTITLE_FOLDERS)
                        {
                            if (string.IsNullOrEmpty(Path.GetPathRoot(folder)) && Directory.Exists(Path.Combine(Path.GetDirectoryName(filePath), folder))) //Is relative path
                            {
                                subFiles = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(filePath), folder), Path.GetFileNameWithoutExtension(filePath) + "*.*");
                            }
                            else if (Directory.Exists(folder)) //Is absolute path
                            {
                                subFiles = Directory.GetFiles(folder, Path.GetFileNameWithoutExtension(filePath) + "*.*");
                            }

                            if (subFiles != null)
                            {
                                subs.AddRange(subFiles);
                            }
                        }
                        foreach (string subFile in subFiles)
                        {
                            if (!HasSubtitleExtension(subFile))
                            {
                                continue;
                            }

                            LocalFsResourceAccessor fsra = new LocalFsResourceAccessor((LocalFsResourceProvider)lfsra.ParentProvider, LocalFsResourceProviderBase.ToProviderPath(subFile));

                            //Check if already exists
                            bool exists = false;
                            foreach (MultipleMediaItemAspect providerResourceAspect in providerResourceAspects)
                            {
                                string       subAccessorPath = (string)providerResourceAspect.GetAttributeValue(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH);
                                ResourcePath subResourcePath = ResourcePath.Deserialize(subAccessorPath);
                                if (subResourcePath.Equals(fsra.CanonicalLocalResourcePath))
                                {
                                    //Already exists
                                    exists = true;
                                    break;
                                }
                            }
                            if (exists)
                            {
                                continue;
                            }

                            string subFormat = GetSubtitleFormat(subFile);
                            if (!string.IsNullOrEmpty(subFormat))
                            {
                                MultipleMediaItemAspect providerResourceAspect = MediaItemAspect.CreateAspect(extractedAspectData, ProviderResourceAspect.Metadata);
                                providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_INDEX, newResourceIndex);
                                providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_TYPE, ProviderResourceAspect.TYPE_SECONDARY);
                                providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_MIME_TYPE, GetSubtitleMime(subFormat));
                                providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_SIZE, fsra.Size);
                                providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, fsra.CanonicalLocalResourcePath.Serialize());

                                MultipleMediaItemAspect subtitleResourceAspect = MediaItemAspect.CreateAspect(extractedAspectData, SubtitleAspect.Metadata);
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_RESOURCE_INDEX, newResourceIndex);
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_VIDEO_RESOURCE_INDEX, videoResouceIndex);
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_STREAM_INDEX, -1); //External subtitle
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_SUBTITLE_FORMAT, subFormat);
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_INTERNAL, false);
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_DEFAULT, subFile.ToLowerInvariant().Contains(".default."));
                                subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_FORCED, subFile.ToLowerInvariant().Contains(".forced."));

                                bool   imageBased = IsImageBasedSubtitle(subFormat);
                                string language   = GetSubtitleLanguage(subFile, imageBased);
                                if (language != null)
                                {
                                    subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_SUBTITLE_LANGUAGE, language);
                                }
                                if (imageBased == false)
                                {
                                    string encoding = GetSubtitleEncoding(subFile, language);
                                    if (encoding != null)
                                    {
                                        subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_SUBTITLE_ENCODING, encoding);
                                    }
                                }
                                else
                                {
                                    subtitleResourceAspect.SetAttribute(SubtitleAspect.ATTR_SUBTITLE_ENCODING, SubtitleAspect.BINARY_ENCODING);
                                }
                                newResourceIndex++;
                                subtitleCount++;
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Info("SubtitleMetadataExtractor: Exception finding external subtitles for resource '{0}' (Text: '{1}')", e, lfsra.CanonicalLocalResourcePath, e.Message);
            }
            return(subtitleCount);
        }
 public VideoPlayerForComSkipTests(string zipResource)
 {
     _zipResource     = zipResource;
     _localRsAccessor = new LocalFsResourceAccessor(_localRsProvider, "/" + Path.Combine(@"TestData\ComSkip", _zipResource + ".zip"));
 }