public void TestAudioItem()
        {
            IList <IDirectoryObject> objects = new List <IDirectoryObject>();

            Guid id = new Guid("11111111-aaaa-aaaa-aaaa-111111111111");
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();

            SingleMediaItemAspect aspect1 = new SingleMediaItemAspect(MediaAspect.Metadata);

            aspect1.SetAttribute(MediaAspect.ATTR_TITLE, "The Track");
            MediaItemAspect.SetAspect(aspects, aspect1);

            MultipleMediaItemAspect aspect2 = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            aspect2.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\file.mp3");
            MediaItemAspect.AddOrUpdateAspect(aspects, aspect2);

            SingleMediaItemAspect aspect3 = new SingleMediaItemAspect(AudioAspect.Metadata);

            MediaItemAspect.SetAspect(aspects, aspect3);

            MediaItem item = new MediaItem(id, aspects);

            objects.Add(MediaLibraryHelper.InstansiateMediaLibraryObject(item, null, null));

            GenericDidlMessageBuilder builder = new GenericDidlMessageBuilder();

            builder.BuildAll("*", objects);

            string xml = builder.ToString();

            Console.WriteLine("XML: {0}", xml);
        }
Esempio n. 2
0
        private static void TransferTransientAspects(IDictionary <Guid, IList <MediaItemAspect> > aspects, IEnumerable <MediaItem> destinationMediaItems)
        {
            var transientAspects = MediaItemAspect.GetAspects(aspects).Where(mia => mia.Metadata.IsTransientAspect);

            foreach (MediaItemAspect aspect in transientAspects)
            {
                SingleMediaItemAspect singleAspect = aspect as SingleMediaItemAspect;
                if (singleAspect != null)
                {
                    foreach (MediaItem destination in destinationMediaItems)
                    {
                        MediaItemAspect.SetAspect(destination.Aspects, singleAspect);
                    }
                }
                else
                {
                    MultipleMediaItemAspect multiAspect = aspect as MultipleMediaItemAspect;
                    if (multiAspect != null)
                    {
                        foreach (MediaItem destination in destinationMediaItems)
                        {
                            MediaItemAspect.AddOrUpdateAspect(destination.Aspects, multiAspect);
                        }
                    }
                }
            }
        }
Esempio n. 3
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));
        }
Esempio n. 4
0
        public MockedDatabaseMovie(MediaLibraryMovie movie, int playPercentage)
        {
            IDictionary <Guid, IList <MediaItemAspect> > movieAspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + movie.Title + ".mkv");
            MediaItemAspect.AddOrUpdateAspect(movieAspects, resourceAspect);
            MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_MOVIE, movie.Imdb);
            MediaItemAspect.SetAttribute(movieAspects, MovieAspect.ATTR_MOVIE_NAME, movie.Title);

            SingleMediaItemAspect mediaItemAspect = new SingleMediaItemAspect(MediaAspect.Metadata);

            mediaItemAspect.SetAttribute(MediaAspect.ATTR_PLAYCOUNT, 1);
            mediaItemAspect.SetAttribute(MediaAspect.ATTR_LASTPLAYED, DateTime.Now);
            MediaItemAspect.SetAspect(movieAspects, mediaItemAspect);

            SingleMediaItemAspect importerAspect = new SingleMediaItemAspect(ImporterAspect.Metadata);

            importerAspect.SetAttribute(ImporterAspect.ATTR_DATEADDED, DateTime.Now);

            IDictionary <string, string> userData = new Dictionary <string, string>();

            userData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, playPercentage.ToString());
            MediaItemAspect.SetAspect(movieAspects, importerAspect);

            Movie = new MediaItem(Guid.NewGuid(), movieAspects, userData);
        }
 private void CopyAspects(MediaItem sourceMediaItem, MediaItem destinationMediaItem)
 {
     foreach (IList <MediaItemAspect> aspectList in sourceMediaItem.Aspects.Values.ToList())
     {
         foreach (MediaItemAspect aspectData in aspectList.ToList())
         {
             if (aspectData is SingleMediaItemAspect)
             {
                 MediaItemAspect.SetAspect(destinationMediaItem.Aspects, (SingleMediaItemAspect)aspectData);
             }
             else if (aspectData is MultipleMediaItemAspect)
             {
                 MediaItemAspect.AddOrUpdateAspect(destinationMediaItem.Aspects, (MultipleMediaItemAspect)aspectData);
             }
         }
     }
 }
Esempio n. 6
0
        public MockedDatabaseEpisode(string tvDbId, int seasonIndex, List <int> episodeIndex, int playPercentage)
        {
            IDictionary <Guid, IList <MediaItemAspect> > episodeAspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + tvDbId + ".mkv");
            MediaItemAspect.AddOrUpdateAspect(episodeAspects, resourceAspect);
            MediaItemAspect.AddOrUpdateExternalIdentifier(episodeAspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, tvDbId);
            MediaItemAspect.SetAttribute(episodeAspects, EpisodeAspect.ATTR_SEASON, seasonIndex);
            MediaItemAspect.SetCollectionAttribute(episodeAspects, EpisodeAspect.ATTR_EPISODE, episodeIndex);
            SingleMediaItemAspect smia = new SingleMediaItemAspect(MediaAspect.Metadata);

            MediaItemAspect.SetAspect(episodeAspects, smia);
            IDictionary <string, string> userData = new Dictionary <string, string>();

            userData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, playPercentage.ToString());

            Episode = new MediaItem(Guid.NewGuid(), episodeAspects, userData);
        }
        public MockedDatabaseMovie(string imdbId, string tmdbId, string title, int year, int playPercentage)
        {
            IDictionary <Guid, IList <MediaItemAspect> > movieAspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + title + ".mkv");
            MediaItemAspect.AddOrUpdateAspect(movieAspects, resourceAspect);
            MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_MOVIE, imdbId);
            MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_MOVIE, tmdbId);
            MediaItemAspect.SetAttribute(movieAspects, MovieAspect.ATTR_MOVIE_NAME, title);
            SingleMediaItemAspect smia = new SingleMediaItemAspect(MediaAspect.Metadata);

            smia.SetAttribute(MediaAspect.ATTR_RECORDINGTIME, new DateTime(year, 1, 1));
            MediaItemAspect.SetAspect(movieAspects, smia);
            IDictionary <string, string> userData = new Dictionary <string, string>();

            userData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, playPercentage.ToString());
            Movie = new MediaItem(Guid.NewGuid(), movieAspects, userData);
        }
        public void TestAudioItem()
        {
            IList <IDirectoryObject> objects = new List <IDirectoryObject>();

            BasicContainer root = new BasicContainer("TEST", new EndPointSettings
            {
                PreferredSubtitleLanguages = new string[] { "EN" },
                PreferredAudioLanguages    = new string[] { "EN" },
                Profile = new EndPointProfile()
            });

            Guid id = new Guid("11111111-aaaa-aaaa-aaaa-111111111111");
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();

            SingleMediaItemAspect aspect1 = new SingleMediaItemAspect(MediaAspect.Metadata);

            aspect1.SetAttribute(MediaAspect.ATTR_TITLE, "The Track");
            MediaItemAspect.SetAspect(aspects, aspect1);

            MultipleMediaItemAspect aspect2 = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            aspect2.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\file.mp3");
            MediaItemAspect.AddOrUpdateAspect(aspects, aspect2);

            SingleMediaItemAspect aspect3 = new SingleMediaItemAspect(AudioAspect.Metadata);

            MediaItemAspect.SetAspect(aspects, aspect3);

            MediaItem item = new MediaItem(id, aspects);

            objects.Add(MediaLibraryHelper.InstansiateMediaLibraryObject(item, root, "Test"));

            GenericDidlMessageBuilder builder = new GenericDidlMessageBuilder();

            builder.BuildAll("*", objects);

            string xml = builder.ToString();

            Console.WriteLine("XML: {0}", xml);
        }
        public MockedDatabaseMovie(MediaLibraryMovie movie)
        {
            IDictionary <Guid, IList <MediaItemAspect> > movieAspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + movie.Title + ".mkv");
            MediaItemAspect.AddOrUpdateAspect(movieAspects, resourceAspect);
            MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_MOVIE, movie.Imdb);
            MediaItemAspect.SetAttribute(movieAspects, MovieAspect.ATTR_MOVIE_NAME, movie.Title);

            SingleMediaItemAspect mediaItemAspect = new SingleMediaItemAspect(MediaAspect.Metadata);

            mediaItemAspect.SetAttribute(MediaAspect.ATTR_PLAYCOUNT, movie.PlayCount);
            mediaItemAspect.SetAttribute(MediaAspect.ATTR_LASTPLAYED, DateTime.Parse(movie.LastPlayed));
            MediaItemAspect.SetAspect(movieAspects, mediaItemAspect);

            SingleMediaItemAspect importerAspect = new SingleMediaItemAspect(ImporterAspect.Metadata);

            importerAspect.SetAttribute(ImporterAspect.ATTR_DATEADDED, DateTime.Parse(movie.AddedToDb));
            MediaItemAspect.SetAspect(movieAspects, importerAspect);

            Movie = new MediaItem(Guid.NewGuid(), movieAspects);
        }
Esempio n. 10
0
        public void TestComplexItem()
        {
            Guid trackId  = new Guid("11111111-aaaa-aaaa-aaaa-100000000000");
            Guid albumId  = new Guid("11111111-aaaa-aaaa-aaaa-100000000001");
            Guid artistId = new Guid("11111111-aaaa-aaaa-aaaa-100000000002");

            Guid trackRelationship  = new Guid("22222222-bbbb-bbbb-bbbb-200000000001");
            Guid albumRelationship  = new Guid("33333333-cccc-cccc-cccc-300000000001");
            Guid artistRelationship = new Guid("44444444-dddd-dddd-dddd-400000000001");

            IDictionary <Guid, IList <MediaItemAspect> > aspects1 = new Dictionary <Guid, IList <MediaItemAspect> >();

            MultipleMediaItemAspect resourceAspect1 = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect1.Deleted = true;
            resourceAspect1.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\file.mp3");
            MediaItemAspect.AddOrUpdateAspect(aspects1, resourceAspect1);

            MediaItemAspect.AddOrUpdateRelationship(aspects1, trackRelationship, albumRelationship, albumId, 1);
            MediaItemAspect.AddOrUpdateRelationship(aspects1, trackRelationship, artistRelationship, artistId, 0);

            MediaItem track1 = new MediaItem(trackId, aspects1);

            TextWriter writer     = new StringWriter();
            XmlWriter  serialiser = new XmlTextWriter(writer);

            serialiser.WriteStartElement("Test"); // Wrapper around the tracks
            // Write the track twice
            track1.Serialize(serialiser);
            track1.Serialize(serialiser);
            serialiser.WriteEndElement();

            //Console.WriteLine("XML: {0}", writer.ToString());
            //Assert.AreEqual("<MI Id=\"" + trackId + "\"><Relationship ItemType=\"" + AudioAspect.RELATIONSHIP_TRACK + "\" RelationshipType=\"" + AlbumAspect.RELATIONSHIP_ALBUM + "\" RelationshipId=\"" + albumId + "\" /></MI>", trackText.ToString(), "Track XML");

            XmlReader reader = XmlReader.Create(new StringReader(writer.ToString()));

            reader.Read(); // Test
            //Console.WriteLine("Reader state Test, {0} {1}", reader.NodeType, reader.Name);

            // Read the track once
            reader.Read(); // MI
            //Console.WriteLine("Reader state track2, {0} {1}", reader.NodeType, reader.Name);
            MediaItem track2 = MediaItem.Deserialize(reader);

            IList <MultipleMediaItemAspect> resourceAspect2;

            Assert.IsTrue(MediaItemAspect.TryGetAspects(track2.Aspects, ProviderResourceAspect.Metadata, out resourceAspect2), "Resource aspects");
            Assert.AreEqual(true, resourceAspect2[0].Deleted, "Track deleted status");
            Assert.AreEqual("c:\\file.mp3", resourceAspect2[0].GetAttributeValue <string>(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH), "Track location");
            IList <MediaItemAspect> relationships2 = track2[RelationshipAspect.ASPECT_ID];

            Assert.IsTrue(track2[RelationshipAspect.ASPECT_ID] != null, "Relationship aspects");
            Assert.AreEqual(relationships2.Count, 2, "Track relationship count");
            Assert.AreEqual(trackRelationship, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(albumRelationship, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(albumId, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");
            Assert.AreEqual(trackRelationship, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(artistRelationship, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(artistId, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");

            // Read the track a second time (
            //Console.WriteLine("Reader state track3, {0} {1}", reader.NodeType, reader.Name);
            MediaItem track3 = MediaItem.Deserialize(reader);

            IList <MultipleMediaItemAspect> resourceAspect3;

            Assert.IsTrue(MediaItemAspect.TryGetAspects(track3.Aspects, ProviderResourceAspect.Metadata, out resourceAspect3), "Resource aspects");
            Assert.AreEqual("c:\\file.mp3", resourceAspect3[0].GetAttributeValue <string>(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH), "Track location");
            IList <MediaItemAspect> relationships3 = track3[RelationshipAspect.ASPECT_ID];

            Assert.IsTrue(track3[RelationshipAspect.ASPECT_ID] != null, "Relationship aspects");
            Assert.AreEqual(2, relationships3.Count, "Track relationship count");
            Assert.AreEqual(trackRelationship, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(albumRelationship, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(albumId, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");
            Assert.AreEqual(trackRelationship, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(artistRelationship, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(artistId, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");

            reader.Read(); // Test
        }
Esempio n. 11
0
        public void TestRelationshipSerialization()
        {
            IDictionary <Guid, IList <MediaItemAspect> > aspects1 = new Dictionary <Guid, IList <MediaItemAspect> >();
            Guid trackId  = new Guid("11111111-aaaa-aaaa-aaaa-100000000000");
            Guid albumId  = new Guid("11111111-aaaa-aaaa-aaaa-100000000001");
            Guid artistId = new Guid("11111111-aaaa-aaaa-aaaa-100000000002");

            Guid trackRelationship  = new Guid("22222222-bbbb-bbbb-bbbb-200000000001");
            Guid albumRelationship  = new Guid("33333333-cccc-cccc-cccc-300000000001");
            Guid artistRelationship = new Guid("44444444-dddd-dddd-dddd-400000000001");

            MediaItemAspect.AddOrUpdateRelationship(aspects1, trackRelationship, albumRelationship, albumId, true, 1);
            MediaItemAspect.AddOrUpdateRelationship(aspects1, trackRelationship, artistRelationship, artistId, false, 0);

            MultipleMediaItemAspect resourceAspect1 = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata);

            resourceAspect1.Deleted = true;
            resourceAspect1.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\file.mp3");
            MediaItemAspect.AddOrUpdateAspect(aspects1, resourceAspect1);

            Guid role1       = new Guid("55555555-eeee-eeee-eeee-500000000001");
            Guid linkedRole1 = new Guid("66666666-ffff-ffff-ffff-600000000001");

            RelationshipItem relationship1 = new RelationshipItem(role1, linkedRole1, aspects1);

            TextWriter writer     = new StringWriter();
            XmlWriter  serialiser = new XmlTextWriter(writer);

            serialiser.WriteStartElement("Test"); // Wrapper around the relationships
            // Write the relationship twice
            relationship1.Serialize(serialiser);
            relationship1.Serialize(serialiser);
            serialiser.WriteEndElement();

            XmlReader reader = XmlReader.Create(new StringReader(writer.ToString()));

            reader.Read(); // Test

            // Read the relationship once
            reader.Read(); // RI
            RelationshipItem relationship2 = RelationshipItem.Deserialize(reader);

            Assert.AreEqual(relationship2.Role, role1, "Role");
            Assert.AreEqual(relationship2.LinkedRole, linkedRole1, "Linked role");
            IList <MultipleMediaItemAspect> resourceAspect2;

            Assert.IsTrue(MediaItemAspect.TryGetAspects(relationship2.Aspects, ProviderResourceAspect.Metadata, out resourceAspect2), "Resource aspects");
            Assert.AreEqual(true, resourceAspect2[0].Deleted, "Track deleted status");
            Assert.AreEqual("c:\\file.mp3", resourceAspect2[0].GetAttributeValue <string>(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH), "Track location");
            IList <MediaItemAspect> relationships2 = relationship2.Aspects[RelationshipAspect.ASPECT_ID];

            Assert.IsTrue(relationship2.Aspects[RelationshipAspect.ASPECT_ID] != null, "Relationship aspects");
            Assert.AreEqual(relationships2.Count, 2, "Track relationship count");
            Assert.AreEqual(trackRelationship, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(albumRelationship, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(albumId, relationships2[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");
            Assert.AreEqual(trackRelationship, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(artistRelationship, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(artistId, relationships2[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");

            // Read the relationship a second time
            RelationshipItem relationship3 = RelationshipItem.Deserialize(reader);

            Assert.AreEqual(relationship3.Role, relationship2.Role, "Role");
            Assert.AreEqual(relationship3.LinkedRole, relationship2.LinkedRole, "Linked role");
            IList <MultipleMediaItemAspect> resourceAspect3;

            Assert.IsTrue(MediaItemAspect.TryGetAspects(relationship3.Aspects, ProviderResourceAspect.Metadata, out resourceAspect3), "Resource aspects");
            Assert.AreEqual("c:\\file.mp3", resourceAspect3[0].GetAttributeValue <string>(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH), "Track location");
            IList <MediaItemAspect> relationships3 = relationship3.Aspects[RelationshipAspect.ASPECT_ID];

            Assert.IsTrue(relationship3.Aspects[RelationshipAspect.ASPECT_ID] != null, "Relationship aspects");
            Assert.AreEqual(2, relationships3.Count, "Track relationship count");
            Assert.AreEqual(trackRelationship, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(albumRelationship, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(albumId, relationships3[0].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");
            Assert.AreEqual(trackRelationship, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_ROLE), "Track -> album item type");
            Assert.AreEqual(artistRelationship, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ROLE), "Track -> album relationship type");
            Assert.AreEqual(artistId, relationships3[1].GetAttributeValue(RelationshipAspect.ATTR_LINKED_ID), "Track -> album relationship ID");

            reader.Read(); // Test
        }
Esempio n. 12
0
        public IList <MediaItem> Query(ISQLDatabase database, ITransaction transaction, bool singleMode)
        {
            ILogger logger = ServiceRegistration.Get <ILogger>();

            try
            {
                IList <MediaItemAspectMetadata> selectedMIAs = new List <MediaItemAspectMetadata>(_necessaryRequestedMIAs.Union(_optionalRequestedMIAs));

                IList <Guid> mediaItemIds;
                IDictionary <Guid, IList <Guid> > complexMediaItemIds;
                IList <MediaItem> mediaItems = GetMediaItems(database, transaction, singleMode, selectedMIAs, out mediaItemIds, out complexMediaItemIds);

                //logger.Debug("CompiledMediaItemQuery::Query got media items IDs [{0}]", string.Join(",", mediaItemIds));

                // TODO: Why bother looking for complex attributes on MIAs we don't have?
                IDictionary <Guid, IDictionary <MediaItemAspectMetadata.AttributeSpecification, IList> > complexAttributeValues =
                    new Dictionary <Guid, IDictionary <MediaItemAspectMetadata.AttributeSpecification, IList> >();

                ICollection <IList <Guid> > mediaItemIdsClusters = CollectionUtils.Cluster(mediaItemIds, CompiledFilter.MAX_IN_VALUES_SIZE);

                foreach (IList <Guid> mediaItemIdsCluster in mediaItemIdsClusters.Where(x => x.Count > 0))
                {
                    AddComplexAttributes(database, transaction, mediaItemIdsCluster, complexAttributeValues, complexMediaItemIds);
                }

                foreach (MediaItem mediaItem in mediaItems)
                {
                    foreach (SingleMediaItemAspectMetadata miam in selectedMIAs.Where(x => x is SingleMediaItemAspectMetadata))
                    {
                        // Skip complex attributes for this MIA if it's not already in the media item
                        if (!mediaItem.Aspects.ContainsKey(miam.AspectId))
                        {
                            continue;
                        }
                        IDictionary <MediaItemAspectMetadata.AttributeSpecification, IList> attributeValues;
                        if (!complexAttributeValues.TryGetValue(mediaItem.MediaItemId, out attributeValues))
                        {
                            continue;
                        }
                        SingleMediaItemAspect mia = MediaItemAspect.GetOrCreateAspect(mediaItem.Aspects, miam);
                        foreach (MediaItemAspectMetadata.AttributeSpecification attr in miam.AttributeSpecifications.Values)
                        {
                            if (attr.Cardinality != Cardinality.Inline)
                            {
                                IList attrValues;
                                if (attributeValues != null && attributeValues.TryGetValue(attr, out attrValues))
                                {
                                    mia.SetCollectionAttribute(attr, attrValues);
                                }
                            }
                        }
                    }
                }

                IDictionary <Guid, ICollection <MultipleMediaItemAspect> > multipleMiaValues =
                    new Dictionary <Guid, ICollection <MultipleMediaItemAspect> >();
                foreach (IList <Guid> mediaItemIdsCluster in mediaItemIdsClusters.Where(x => x.Count > 0))
                {
                    AddMultipleMIAs(database, transaction, _explicitRequestedMIAs, mediaItemIdsCluster, multipleMiaValues);
                }

                if (multipleMiaValues.Count > 0)
                {
                    //logger.Debug("Got multiple MIAs [{0}]", string.Join(",", multipleMiaValues.Keys));
                    foreach (MediaItem mediaItem in mediaItems)
                    {
                        ICollection <MultipleMediaItemAspect> values;
                        if (!multipleMiaValues.TryGetValue(mediaItem.MediaItemId, out values))
                        {
                            continue;
                        }
                        foreach (MultipleMediaItemAspect value in values)
                        {
                            //logger.Debug("Adding MIA {0} #{1}", value.Metadata.Name, value.Index);
                            MediaItemAspect.AddOrUpdateAspect(mediaItem.Aspects, value);
                        }
                    }
                }

                return(mediaItems);
            }
            catch (Exception e)
            {
                logger.Error("Unable to query", e);
                throw e;
            }
        }