public VideoPlayerForComSkipTests(string zipResource) { _zipResource = zipResource; string testDataDir = TestContext.CurrentContext.TestDirectory + "\\VideoPlayers\\ComSkip\\TestData\\"; _localRsAccessor = new LocalFsResourceAccessor(_localRsProvider, "/" + Path.Combine(testDataDir, _zipResource + ".zip")); }
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")); }