Пример #1
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);
        }
Пример #2
0
        /// <summary>
        /// Copies the contained character information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData)
        {
            if (CollectionName.IsEmpty)
            {
                return(false);
            }

            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(CollectionName.Text));
            //MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, true); //Is maintained by medialibrary and metadataextractors
            MediaItemAspect.SetAttribute(aspectData, MovieCollectionAspect.ATTR_COLLECTION_NAME, CollectionName.Text);
            if (TotalMovies > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieCollectionAspect.ATTR_NUM_MOVIES, TotalMovies);
            }

            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_COLLECTION, MovieDbId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_COLLECTION, NameId);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #3
0
        public void TestCreateExternalItemIdentifiers()
        {
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, "tvdb_01");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, "tvmaze_01");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_EPISODE, "tvdb_02");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_EPISODE, "tvmaze_02");

            var           seriesIdentifiers         = RelationshipExtractorUtils.CreateExternalItemIdentifiers(aspects, ExternalIdentifierAspect.TYPE_SERIES);
            List <string> expectedSeriesIdentifiers = new List <string>
            {
                string.Format("{0} | {1} | {2}", ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, "tvdb_01"),
                string.Format("{0} | {1} | {2}", ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, "tvmaze_01")
            };

            CollectionAssert.AreEqual(seriesIdentifiers, expectedSeriesIdentifiers);

            var           episodeIdentifiers         = RelationshipExtractorUtils.CreateExternalItemIdentifiers(aspects, ExternalIdentifierAspect.TYPE_EPISODE);
            List <string> expectedEpisodeIdentifiers = new List <string>
            {
                string.Format("{0} | {1} | {2}", ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_EPISODE, "tvdb_02"),
                string.Format("{0} | {1} | {2}", ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_EPISODE, "tvmaze_02")
            };

            CollectionAssert.AreEqual(episodeIdentifiers, expectedEpisodeIdentifiers);
        }
Пример #4
0
 /// <summary>
 /// Tries to write metadata into external id.
 /// </summary>
 /// <param name="extractedAspectData">Dictionary of <see cref="MediaItemAspect"/>s to write into</param>
 /// <returns><c>true</c> if any information was written; otherwise <c>false</c></returns>
 private bool TryWriteAlbumAspectAudioDbId(IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData)
 {
     if (_stubs[0].AudioDbId.HasValue)
     {
         MediaItemAspect.AddOrUpdateExternalIdentifier(extractedAspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_ALBUM, _stubs[0].AudioDbId.Value.ToString());
         return(true);
     }
     return(false);
 }
Пример #5
0
 /// <summary>
 /// Tries to write metadata into <see cref="ExternalIdentifierAspect.ATTR_ID"/>
 /// </summary>
 /// <param name="extractedAspectData">Dictionary of <see cref="MediaItemAspect"/>s to write into</param>
 /// <returns><c>true</c> if any information was written; otherwise <c>false</c></returns>
 private bool TryWriteExternalIdentifierAspectMusicBrainzArtistId(IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData)
 {
     if (_stubs[0].MusicBrainzArtistId != null)
     {
         MediaItemAspect.AddOrUpdateExternalIdentifier(extractedAspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_PERSON, _stubs[0].MusicBrainzArtistId);
         return(true);
     }
     return(false);
 }
Пример #6
0
 /// <summary>
 /// Tries to write metadata into external id.
 /// </summary>
 /// <param name="extractedAspectData">Dictionary of <see cref="MediaItemAspect"/>s to write into</param>
 /// <returns><c>true</c> if any information was written; otherwise <c>false</c></returns>
 private bool TryWriteAlbumAspectMusicBrainzGroupId(IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData)
 {
     if (!string.IsNullOrEmpty(_stubs[0].MusicBrainzReleaseGroupId))
     {
         MediaItemAspect.AddOrUpdateExternalIdentifier(extractedAspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ_GROUP, ExternalIdentifierAspect.TYPE_ALBUM, _stubs[0].MusicBrainzReleaseGroupId);
         return(true);
     }
     return(false);
 }
Пример #7
0
        protected static MediaItem CreateMediaItem(BassUtils.AudioTrack track, char drive, int numTracks, string systemId, string title = null, string artist = null, string album = null, string albumArtist = null, string cdDbId = null, string upc = null, string irsc = null)
        {
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();
            MediaItemAspect providerResourceAspect = MediaItemAspect.CreateAspect(aspects, ProviderResourceAspect.Metadata);

            providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_INDEX, 0);
            providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_TYPE, ProviderResourceAspect.TYPE_PRIMARY);
            MediaItemAspect mediaAspect = MediaItemAspect.GetOrCreateAspect(aspects, MediaAspect.Metadata);
            MediaItemAspect audioAspect = MediaItemAspect.GetOrCreateAspect(aspects, AudioAspect.Metadata);

            if (!string.IsNullOrEmpty(irsc))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_ISRC, ExternalIdentifierAspect.TYPE_TRACK, irsc);
            }
            if (!string.IsNullOrEmpty(cdDbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_CDDB, ExternalIdentifierAspect.TYPE_ALBUM, cdDbId);
            }
            if (!string.IsNullOrEmpty(upc))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_UPCEAN, ExternalIdentifierAspect.TYPE_ALBUM, upc);
            }

            // TODO: Collect data from internet for the current audio CD
            providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH,
                                                AudioCDResourceProvider.ToResourcePath(drive, track.TrackNo).Serialize());
            providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_SYSTEM_ID, systemId);
            mediaAspect.SetAttribute(MediaAspect.ATTR_TITLE, GetTrackTitle(album, (int)track.TrackNo, title));
            audioAspect.SetAttribute(AudioAspect.ATTR_TRACK, (int)track.TrackNo);
            audioAspect.SetAttribute(AudioAspect.ATTR_DURATION, (long)track.Duration);
            audioAspect.SetAttribute(AudioAspect.ATTR_ENCODING, "PCM");
            audioAspect.SetAttribute(AudioAspect.ATTR_BITRATE, 1411); // 44.1 kHz * 16 bit * 2 channel
            audioAspect.SetAttribute(AudioAspect.ATTR_CHANNELS, 2);
            audioAspect.SetAttribute(AudioAspect.ATTR_NUMTRACKS, numTracks);

            if (!string.IsNullOrEmpty(album))
            {
                audioAspect.SetAttribute(AudioAspect.ATTR_ALBUM, album);
            }
            if (!string.IsNullOrEmpty(title))
            {
                audioAspect.SetAttribute(AudioAspect.ATTR_TRACKNAME, title);
            }
            if (!string.IsNullOrEmpty(artist))
            {
                audioAspect.SetCollectionAttribute(AudioAspect.ATTR_ARTISTS, new string[] { artist });
            }
            if (!string.IsNullOrEmpty(albumArtist))
            {
                audioAspect.SetCollectionAttribute(AudioAspect.ATTR_ALBUMARTISTS, new string[] { albumArtist });
            }

            return(new MediaItem(Guid.Empty, aspects));
        }
Пример #8
0
        public void TestExternalItem()
        {
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, "test", ExternalIdentifierAspect.TYPE_EPISODE, "123");

            Assert.AreEqual(aspects.Keys.Count, 1, "aspect key count");

            IList <MultipleMediaItemAspect> externalIdentifiers;

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, "test", ExternalIdentifierAspect.TYPE_SERIES, "456");
            Assert.IsTrue(MediaItemAspect.TryGetAspects(aspects, ExternalIdentifierAspect.Metadata, out externalIdentifiers), "Relationships");
            Assert.AreEqual(externalIdentifiers.Count, 2);

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, "test", ExternalIdentifierAspect.TYPE_SERIES, "789");
            Assert.IsTrue(MediaItemAspect.TryGetAspects(aspects, ExternalIdentifierAspect.Metadata, out externalIdentifiers), "Relationships");
            Assert.AreEqual(externalIdentifiers.Count, 2);
        }
Пример #9
0
        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);
        }
Пример #10
0
        public void TestCreateExternalItemFilter()
        {
            IDictionary <Guid, IList <MediaItemAspect> > aspects = new Dictionary <Guid, IList <MediaItemAspect> >();

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, "tvdb_01");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, "tvmaze_01");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_EPISODE, "tvdb_02");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_EPISODE, "tvmaze_02");

            IFilter seriesFilter = RelationshipExtractorUtils.CreateExternalItemFilter(aspects, ExternalIdentifierAspect.TYPE_SERIES);

            Assert.AreEqual(seriesFilter.ToString(),
                            "ExternalIdentifier.Source EQ TVDB And ExternalIdentifier.Type EQ SERIES And ExternalIdentifier.Id EQ tvdb_01 Or ExternalIdentifier.Source EQ TVMAZE And ExternalIdentifier.Type EQ SERIES And ExternalIdentifier.Id EQ tvmaze_01");

            IFilter episodeFilter = RelationshipExtractorUtils.CreateExternalItemFilter(aspects, ExternalIdentifierAspect.TYPE_EPISODE);

            Assert.AreEqual(episodeFilter.ToString(),
                            "ExternalIdentifier.Source EQ TVDB And ExternalIdentifier.Type EQ EPISODE And ExternalIdentifier.Id EQ tvdb_02 Or ExternalIdentifier.Source EQ TVMAZE And ExternalIdentifier.Type EQ EPISODE And ExternalIdentifier.Id EQ tvmaze_02");
        }
Пример #11
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);
        }
Пример #12
0
        public void TestExternalMediaItem()
        {
            MockDBUtils.Reset();
            MockCore.SetupLibrary();

            SingleTestMIA mia1 = TestCommonUtils.CreateSingleMIA("SINGLE1", Cardinality.Inline, true, true);

            MockCore.Management.AddMediaItemAspectStorage(mia1.Metadata);

            MockCore.Management.AddMediaItemAspectStorage(ProviderResourceAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(ImporterAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(ExternalIdentifierAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(MediaAspect.Metadata);

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

            SingleMediaItemAspect aspect1 = new SingleMediaItemAspect(mia1.Metadata);

            aspect1.SetAttribute(mia1.ATTR_INTEGER, 1);
            aspect1.SetAttribute(mia1.ATTR_STRING, "one");
            MediaItemAspect.SetAspect(aspects, aspect1);

            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, "test", ExternalIdentifierAspect.TYPE_EPISODE, "123");
            MediaItemAspect.AddOrUpdateExternalIdentifier(aspects, "test", ExternalIdentifierAspect.TYPE_SERIES, "456");

            MockDBUtils.AddReader(1, "SELECT MEDIA_ITEM_ID FROM M_PROVIDERRESOURCE WHERE SYSTEM_ID = @SYSTEM_ID AND PATH = @PATH", "MEDIA_ITEM_ID");
            MockDBUtils.AddReader(2, "SELECT T5.MEDIA_ITEM_ID A23, T0.MEDIA_ITEM_ID A24, T1.MEDIA_ITEM_ID A25, T2.MEDIA_ITEM_ID A26, T3.MEDIA_ITEM_ID A27, T4.MEDIA_ITEM_ID A28, T0.ATTR_STRING A0, " +
                                  "T0.ATTR_INTEGER A1, T1.SYSTEM_ID A2, T1.RESOURCEINDEX A3, T1.ISPRIMARY A4, T1.MIMETYPE A5, T1.SIZE A6, T1.PATH A7, T1.PARENTDIRECTORY A8, T2.LASTIMPORTDATE A9, T2.DIRTY A10, T2.DATEADDED A11, " +
                                  "T3.SOURCE A12, T3.TYPE A13, T3.ID A14, T4.TITLE A15, T4.SORTTITLE A16, T4.RECORDINGTIME A17, T4.RATING A18, T4.COMMENT A19, T4.PLAYCOUNT A20, T4.LASTPLAYED A21, T4.ISVIRTUAL A22 FROM MEDIA_ITEMS T5 " +
                                  "LEFT OUTER JOIN M_SINGLE1 T0 ON T0.MEDIA_ITEM_ID = T5.MEDIA_ITEM_ID LEFT OUTER JOIN M_PROVIDERRESOURCE T1 ON T1.MEDIA_ITEM_ID = T5.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_IMPORTEDITEM T2 ON T2.MEDIA_ITEM_ID = T5.MEDIA_ITEM_ID LEFT OUTER JOIN M_EXTERNALIDENTIFIER T3 ON T3.MEDIA_ITEM_ID = T5.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_MEDIAITEM T4 ON T4.MEDIA_ITEM_ID = T5.MEDIA_ITEM_ID  WHERE T5.MEDIA_ITEM_ID = @V0", "@V0");

            string       pathStr = "c:\\item.mp3";
            ResourcePath path    = LocalFsResourceProviderBase.ToResourcePath(pathStr);

            MockCore.Library.AddOrUpdateMediaItem(Guid.Empty, null, path, aspects.Values.SelectMany(x => x), false);

            MockCore.ShutdownLibrary();
        }
Пример #13
0
        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);
        }
Пример #14
0
        public void TestReconcileMediaItem()
        {
            //TODO: Update below code to work with ML changes
            return;

            MockCore.SetupLibrary(true);

            ServiceRegistration.Set <IPluginManager>(new MockPluginManager());

            MockRelationshipExtractor extractor = new MockRelationshipExtractor();

            MockMediaAccessor accessor = new MockMediaAccessor();

            accessor.AddRelationshipExtractor(extractor);
            ServiceRegistration.Set <IMediaAccessor>(accessor);
            ServiceRegistration.Get <IMediaAccessor>().Initialize();

            MockCore.Management.AddMediaItemAspectStorage(EpisodeAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(ExternalIdentifierAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(ImporterAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(MediaAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(ProviderResourceAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(RelationshipAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(SeasonAspect.Metadata);
            MockCore.Management.AddMediaItemAspectStorage(SeriesAspect.Metadata);

            Guid episodeItemId = new Guid("aaaaaaaa-1111-1111-1111-aaaaaaaaaaaa");
            Guid seasonItemId  = new Guid("bbbbbbbb-2222-2222-2222-bbbbbbbbbbbb");
            Guid seriesItemId  = new Guid("cccccccc-3333-3333-3333-cccccccccccc");

            string seriesName        = "The Series";
            string seriesDescription = "The adventures of some characters";

            int    episode           = 1;
            string episodeName       = "The Episode";
            string episodeTitle      = seriesName + ": " + episodeName;
            Guid   parentDirectoryId = new Guid("dddddddd-4444-4444-4444-dddddddddddd");

            int    season            = 2;
            string seriesSeasonName  = seriesName + " " + season;
            string seasonDescription = "Continuing adventures of some characters, several story arcs etc";

            string externalSource   = "TEST";
            string externalSeriesId = "345";

            MockCore.Library.AddMediaItemId(episodeItemId);
            MockCore.Library.AddMediaItemId(seasonItemId);
            MockCore.Library.AddMediaItemId(seriesItemId);

            string       systemId = "local";
            string       mimeType = "video/mkv";
            string       pathStr  = @"c:\item.mkv";
            ResourcePath path     = LocalFsResourceProviderBase.ToResourcePath(pathStr);
            DateTime     importDate;

            DateTime.TryParse("2014-10-11 12:34:56", out importDate);

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

            MediaItemAspect.SetAttribute(episodeAspects, MediaAspect.ATTR_TITLE, episodeTitle);
            MediaItemAspect.SetCollectionAttribute(episodeAspects, EpisodeAspect.ATTR_EPISODE, new[] { episode });
            MediaItemAspect.SetAttribute(episodeAspects, EpisodeAspect.ATTR_SEASON, season);
            MultipleMediaItemAspect providerResourceAspect = MediaItemAspect.CreateAspect(episodeAspects, ProviderResourceAspect.Metadata);

            providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_MIME_TYPE, mimeType);
            MediaItemAspect.AddOrUpdateExternalIdentifier(episodeAspects, externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);
            ServiceRegistration.Get <ILogger>().Debug("Episode:");
            MockCore.ShowMediaAspects(episodeAspects, MockCore.Library.GetManagedMediaItemAspectMetadata());

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

            MediaItemAspect.SetAttribute(seasonAspects, SeasonAspect.ATTR_SERIES_NAME, seriesName);
            MediaItemAspect.SetAttribute(seasonAspects, SeasonAspect.ATTR_SEASON, season);
            MediaItemAspect.SetAttribute(seasonAspects, SeasonAspect.ATTR_DESCRIPTION, seasonDescription);
            MediaItemAspect.AddOrUpdateExternalIdentifier(seasonAspects, externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);
            ServiceRegistration.Get <ILogger>().Debug("Season:");
            MockCore.ShowMediaAspects(seasonAspects, MockCore.Library.GetManagedMediaItemAspectMetadata());

            Guid[] matchAspects = new[] { SeasonAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID, MediaAspect.ASPECT_ID };
            extractor.AddRelationship(EpisodeAspect.ROLE_EPISODE, new[] { EpisodeAspect.ASPECT_ID }, SeasonAspect.ROLE_SEASON, new[] { SeasonAspect.ASPECT_ID }, matchAspects, externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId, new List <IDictionary <Guid, IList <MediaItemAspect> > >()
            {
                seasonAspects
            }, EpisodeSeasonMatcher, episode);

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

            MediaItemAspect.SetAttribute(seriesAspects, SeasonAspect.ATTR_SERIES_NAME, seriesName);
            MediaItemAspect.SetAttribute(seriesAspects, SeasonAspect.ATTR_DESCRIPTION, seriesDescription);
            MediaItemAspect.AddOrUpdateExternalIdentifier(seriesAspects, externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);
            ServiceRegistration.Get <ILogger>().Debug("Series:");
            MockCore.ShowMediaAspects(seriesAspects, MockCore.Library.GetManagedMediaItemAspectMetadata());

            matchAspects = new[] { SeriesAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID, MediaAspect.ASPECT_ID };
            extractor.AddRelationship(SeasonAspect.ROLE_SEASON, new[] { SeasonAspect.ASPECT_ID }, SeriesAspect.ROLE_SERIES, new[] { SeriesAspect.ASPECT_ID }, matchAspects, externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId, new List <IDictionary <Guid, IList <MediaItemAspect> > >()
            {
                seriesAspects
            }, null, season);

            MockDBUtils.AddReader(1, "SELECT MEDIA_ITEM_ID FROM M_PROVIDERRESOURCE WHERE SYSTEM_ID = @SYSTEM_ID AND PATH = @PATH", "MEDIA_ITEM_ID");

            MockDBUtils.AddReader(2, "SELECT MEDIA_ITEM_ID FROM M_PROVIDERRESOURCE WHERE MEDIA_ITEM_ID = @MEDIA_ITEM_ID", "MEDIA_ITEM_ID");

            // Readers used by UpdateRelationships to find episode item

            MockReader reader2 = MockDBUtils.AddReader(3,
                                                       "SELECT T6.MEDIA_ITEM_ID A30, T0.MEDIA_ITEM_ID A31, T1.MEDIA_ITEM_ID A32, T2.MEDIA_ITEM_ID A33, T3.MEDIA_ITEM_ID A34, T4.MEDIA_ITEM_ID A35, T5.MEDIA_ITEM_ID A36, " +
                                                       "T0.SERIESNAME A0, T0.SEASON A1, T0.SERIESSEASONNAME A2, T0.EPISODENAME A3, T0.FIRSTAIRED A4, T0.TOTALRATING A5, T0.RATINGCOUNT A6, " +
                                                       "T1.LASTIMPORTDATE A7, T1.DIRTY A8, T1.DATEADDED A9, " +
                                                       "T2.TITLE A10, T2.RECORDINGTIME A11, T2.RATING A12, T2.COMMENT A13, T2.PLAYCOUNT A14, T2.LASTPLAYED A15, " +
                                                       "T3.SYSTEM_ID A16, T3.MIMETYPE A17, T3.SIZE A18, T3.PATH A19, T3.PARENTDIRECTORY A20, " +
                                                       "T4.SERIESNAME_0 A21, T4.SEASON_0 A22, T4.SERIESSEASONNAME_0 A23, T4.DESCRIPTION A24, T4.FIRSTAIRED_0 A25, T4.TOTALRATING_0 A26, T4.RATINGCOUNT_0 A27, " +
                                                       "T5.SERIESNAME_1 A28, T5.DESCRIPTION_0 A29 " +
                                                       "FROM MEDIA_ITEMS T6 " +
                                                       "LEFT OUTER JOIN M_EPISODEITEM T0 ON T0.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                       "LEFT OUTER JOIN M_IMPORTEDITEM T1 ON T1.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                       "LEFT OUTER JOIN M_MEDIAITEM T2 ON T2.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                       "LEFT OUTER JOIN M_PROVIDERRESOURCE T3 ON T3.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                       "LEFT OUTER JOIN M_SEASONITEM T4 ON T4.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                       "LEFT OUTER JOIN M_SERIESITEM T5 ON T5.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID  " +
                                                       "WHERE T6.MEDIA_ITEM_ID = @V0",
                                                       CreateAttributeIdList(30, 36));

            reader2.AddResult(
                episodeItemId, episodeItemId, episodeItemId, episodeItemId, episodeItemId, null, null,
                null, season, null, null, null, null, null,
                importDate, false, importDate,
                episodeTitle, null, null, null, null, null,
                systemId, mimeType, 100, @"c:\", parentDirectoryId,
                null, null, null, null, null, null, null,
                null, null
                );

            MockReader reader3 = MockDBUtils.AddReader(4,
                                                       "SELECT T0.MEDIA_ITEM_ID A0, " +
                                                       "T1.VALUE A1 " +
                                                       "FROM NM_EPISODE T0 " +
                                                       "INNER JOIN V_EPISODE T1 ON T0.VALUE_ID = T1.VALUE_ID " +
                                                       "WHERE T0.MEDIA_ITEM_ID = @V0",
                                                       "A0", "A1");

            reader3.AddResult(
                episodeItemId,
                episode);

            MockDBUtils.AddReader(5, "SELECT T0.MEDIA_ITEM_ID A0, T1.VALUE A1 FROM NM_DVDEPISODE T0 INNER JOIN V_DVDEPISODE T1 ON T0.VALUE_ID = T1.VALUE_ID WHERE T0.MEDIA_ITEM_ID = @V0", "A0", "A1");

            MockReader reader5 = MockDBUtils.AddReader(6,
                                                       "SELECT T0.MEDIA_ITEM_ID A3, T0.MEDIA_ITEM_ID A4, " +
                                                       "T0.SOURCE A0, T0.TYPE A1, T0.ID A2 " +
                                                       "FROM M_EXTERNALIDENTIFIER T0  " +
                                                       "WHERE T0.MEDIA_ITEM_ID = @V0",
                                                       CreateAttributeIdList(3, 4));

            reader5.AddResult(
                episodeItemId, episodeItemId,
                externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);

            MockDBUtils.AddReader(7,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, " +
                                  "T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 " +
                                  "FROM M_RELATIONSHIP T0  " +
                                  "WHERE T0.MEDIA_ITEM_ID = @V0",
                                  CreateAttributeIdList(3, 4));

            MockDBUtils.AddReader(8,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 FROM M_RELATIONSHIP T0  WHERE T0.LINKEDID IN (@V0)");

            // Readers used by UpdateRelationships to find season item

            MockDBUtils.AddReader(9,
                                  "SELECT T0.MEDIA_ITEM_ID A30, T0.MEDIA_ITEM_ID A31, T1.MEDIA_ITEM_ID A32, T2.MEDIA_ITEM_ID A33, T3.MEDIA_ITEM_ID A34, T4.MEDIA_ITEM_ID A35, T5.MEDIA_ITEM_ID A36, " +
                                  "T0.SERIESNAME_0 A0, T0.SEASON_0 A1, T0.SERIESSEASONNAME_0 A2, T0.DESCRIPTION A3, T0.FIRSTAIRED_0 A4, T0.TOTALRATING_0 A5, T0.RATINGCOUNT_0 A6, " +
                                  "T1.TITLE A7, T1.RECORDINGTIME A8, T1.RATING A9, T1.COMMENT A10, T1.PLAYCOUNT A11, T1.LASTPLAYED A12, " +
                                  "T2.SERIESNAME A13, T2.SEASON A14, T2.SERIESSEASONNAME A15, T2.EPISODENAME A16, T2.FIRSTAIRED A17, T2.TOTALRATING A18, T2.RATINGCOUNT A19, " +
                                  "T3.LASTIMPORTDATE A20, T3.DIRTY A21, T3.DATEADDED A22, " +
                                  "T4.SYSTEM_ID A23, T4.MIMETYPE A24, T4.SIZE A25, T4.PATH A26, T4.PARENTDIRECTORY A27, " +
                                  "T5.SERIESNAME_1 A28, T5.DESCRIPTION_0 A29 " +
                                  "FROM M_SEASONITEM T0 " +
                                  "INNER JOIN M_MEDIAITEM T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_EPISODEITEM T2 ON T2.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_IMPORTEDITEM T3 ON T3.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_PROVIDERRESOURCE T4 ON T4.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_SERIESITEM T5 ON T5.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID  " +
                                  "WHERE T0.MEDIA_ITEM_ID IN(SELECT MEDIA_ITEM_ID FROM M_EXTERNALIDENTIFIER WHERE SOURCE = @V0 AND TYPE = @V1 AND ID = @V2)",
                                  CreateAttributeIdList(30, 36));

            MockDBUtils.AddReader(10, "SELECT MEDIA_ITEM_ID FROM M_PROVIDERRESOURCE WHERE SYSTEM_ID = @SYSTEM_ID AND PATH = @PATH", "MEDIA_ITEM_ID");

            MockReader reader10 = MockDBUtils.AddReader(11,
                                                        "SELECT T6.MEDIA_ITEM_ID A30, T0.MEDIA_ITEM_ID A31, T1.MEDIA_ITEM_ID A32, T2.MEDIA_ITEM_ID A33, T3.MEDIA_ITEM_ID A34, T4.MEDIA_ITEM_ID A35, T5.MEDIA_ITEM_ID A36, " +
                                                        "T0.SERIESNAME A0, T0.SEASON A1, T0.SERIESSEASONNAME A2, T0.EPISODENAME A3, T0.FIRSTAIRED A4, T0.TOTALRATING A5, T0.RATINGCOUNT A6, " +
                                                        "T1.LASTIMPORTDATE A7, T1.DIRTY A8, T1.DATEADDED A9, " +
                                                        "T2.TITLE A10, T2.RECORDINGTIME A11, T2.RATING A12, T2.COMMENT A13, T2.PLAYCOUNT A14, T2.LASTPLAYED A15, " +
                                                        "T3.SYSTEM_ID A16, T3.MIMETYPE A17, T3.SIZE A18, T3.PATH A19, T3.PARENTDIRECTORY A20, " +
                                                        "T4.SERIESNAME_0 A21, T4.SEASON_0 A22, T4.SERIESSEASONNAME_0 A23, T4.DESCRIPTION A24, T4.FIRSTAIRED_0 A25, T4.TOTALRATING_0 A26, T4.RATINGCOUNT_0 A27, " +
                                                        "T5.SERIESNAME_1 A28, T5.DESCRIPTION_0 A29 " +
                                                        "FROM MEDIA_ITEMS T6 " +
                                                        "LEFT OUTER JOIN M_EPISODEITEM T0 ON T0.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_IMPORTEDITEM T1 ON T1.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_MEDIAITEM T2 ON T2.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_PROVIDERRESOURCE T3 ON T3.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_SEASONITEM T4 ON T4.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_SERIESITEM T5 ON T5.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID  " +
                                                        "WHERE T6.MEDIA_ITEM_ID = @V0",
                                                        CreateAttributeIdList(30, 36));

            reader10.AddResult(
                seasonItemId, null, seasonItemId, seasonItemId, seasonItemId, seasonItemId, null,
                null, null, null, null, null, null, null,
                importDate, false, importDate,
                seriesSeasonName, null, null, null, null, null,
                null, null, 0, null, Guid.Empty,
                seriesName, season, seriesSeasonName, seasonDescription, null, null, null,
                null, null
                );

            MockReader reader11 = MockDBUtils.AddReader(12,
                                                        "SELECT T0.MEDIA_ITEM_ID A3, T0.MEDIA_ITEM_ID A4, " +
                                                        "T0.SOURCE A0, T0.TYPE A1, T0.ID A2 " +
                                                        "FROM M_EXTERNALIDENTIFIER T0  " +
                                                        "WHERE T0.MEDIA_ITEM_ID = @V0",
                                                        CreateAttributeIdList(3, 4));

            reader11.AddResult(
                seasonItemId, seasonItemId,
                externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);

            MockDBUtils.AddReader(13,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, " +
                                  "T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 " +
                                  "FROM M_RELATIONSHIP T0  " +
                                  "WHERE T0.MEDIA_ITEM_ID = @V0",
                                  CreateAttributeIdList(3, 4));

            MockDBUtils.AddReader(14,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 FROM M_RELATIONSHIP T0  WHERE T0.LINKEDID IN (@V0)");

            MockDBUtils.AddReader(15,
                                  "SELECT T0.MEDIA_ITEM_ID A30, T0.MEDIA_ITEM_ID A31, T1.MEDIA_ITEM_ID A32, T2.MEDIA_ITEM_ID A33, T3.MEDIA_ITEM_ID A34, T4.MEDIA_ITEM_ID A35, T5.MEDIA_ITEM_ID A36, " +
                                  "T0.SERIESNAME_1 A0, T0.DESCRIPTION_0 A1, " +
                                  "T1.TITLE A2, T1.RECORDINGTIME A3, T1.RATING A4, T1.COMMENT A5, T1.PLAYCOUNT A6, T1.LASTPLAYED A7, " +
                                  "T2.SERIESNAME A8, T2.SEASON A9, T2.SERIESSEASONNAME A10, T2.EPISODENAME A11, T2.FIRSTAIRED A12, T2.TOTALRATING A13, T2.RATINGCOUNT A14, " +
                                  "T3.LASTIMPORTDATE A15, T3.DIRTY A16, T3.DATEADDED A17, " +
                                  "T4.SYSTEM_ID A18, T4.MIMETYPE A19, T4.SIZE A20, T4.PATH A21, T4.PARENTDIRECTORY A22, " +
                                  "T5.SERIESNAME_0 A23, T5.SEASON_0 A24, T5.SERIESSEASONNAME_0 A25, T5.DESCRIPTION A26, T5.FIRSTAIRED_0 A27, T5.TOTALRATING_0 A28, T5.RATINGCOUNT_0 A29 " +
                                  "FROM M_SERIESITEM T0 " +
                                  "INNER JOIN M_MEDIAITEM T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_EPISODEITEM T2 ON T2.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_IMPORTEDITEM T3 ON T3.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_PROVIDERRESOURCE T4 ON T4.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                                  "LEFT OUTER JOIN M_SEASONITEM T5 ON T5.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID  " +
                                  "WHERE T0.MEDIA_ITEM_ID IN(SELECT MEDIA_ITEM_ID FROM M_EXTERNALIDENTIFIER WHERE SOURCE = @V0 AND TYPE = @V1 AND ID = @V2)",
                                  CreateAttributeIdList(30, 36));

            MockDBUtils.AddReader(16, "SELECT MEDIA_ITEM_ID FROM M_PROVIDERRESOURCE WHERE SYSTEM_ID = @SYSTEM_ID AND PATH = @PATH", "MEDIA_ITEM_ID");

            // Readers used by UpdateRelationships to find series item

            MockReader reader16 = MockDBUtils.AddReader(17,
                                                        "SELECT T6.MEDIA_ITEM_ID A30, T0.MEDIA_ITEM_ID A31, T1.MEDIA_ITEM_ID A32, T2.MEDIA_ITEM_ID A33, T3.MEDIA_ITEM_ID A34, T4.MEDIA_ITEM_ID A35, T5.MEDIA_ITEM_ID A36, " +
                                                        "T0.SERIESNAME A0, T0.SEASON A1, T0.SERIESSEASONNAME A2, T0.EPISODENAME A3, T0.FIRSTAIRED A4, T0.TOTALRATING A5, T0.RATINGCOUNT A6, " +
                                                        "T1.LASTIMPORTDATE A7, T1.DIRTY A8, T1.DATEADDED A9, " +
                                                        "T2.TITLE A10, T2.RECORDINGTIME A11, T2.RATING A12, T2.COMMENT A13, T2.PLAYCOUNT A14, T2.LASTPLAYED A15, " +
                                                        "T3.SYSTEM_ID A16, T3.MIMETYPE A17, T3.SIZE A18, T3.PATH A19, T3.PARENTDIRECTORY A20, " +
                                                        "T4.SERIESNAME_0 A21, T4.SEASON_0 A22, T4.SERIESSEASONNAME_0 A23, T4.DESCRIPTION A24, T4.FIRSTAIRED_0 A25, T4.TOTALRATING_0 A26, T4.RATINGCOUNT_0 A27, " +
                                                        "T5.SERIESNAME_1 A28, T5.DESCRIPTION_0 A29 " +
                                                        "FROM MEDIA_ITEMS T6 " +
                                                        "LEFT OUTER JOIN M_EPISODEITEM T0 ON T0.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_IMPORTEDITEM T1 ON T1.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_MEDIAITEM T2 ON T2.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_PROVIDERRESOURCE T3 ON T3.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_SEASONITEM T4 ON T4.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID " +
                                                        "LEFT OUTER JOIN M_SERIESITEM T5 ON T5.MEDIA_ITEM_ID = T6.MEDIA_ITEM_ID  " +
                                                        "WHERE T6.MEDIA_ITEM_ID = @V0",
                                                        CreateAttributeIdList(30, 36));

            reader16.AddResult(
                seriesItemId, null, seasonItemId, seasonItemId, seasonItemId, null, seriesItemId,
                null, null, null, null, null, null, null,
                importDate, false, importDate,
                seriesName, null, null, null, null, null,
                null, null, 0, null, Guid.Empty,
                null, null, null, null, null, null, null,
                seriesName, seriesDescription
                );

            MockReader reader17 = MockDBUtils.AddReader(18,
                                                        "SELECT T0.MEDIA_ITEM_ID A3, T0.MEDIA_ITEM_ID A4, " +
                                                        "T0.SOURCE A0, T0.TYPE A1, T0.ID A2 " +
                                                        "FROM M_EXTERNALIDENTIFIER T0  " +
                                                        "WHERE T0.MEDIA_ITEM_ID = @V0",
                                                        CreateAttributeIdList(3, 4));

            reader17.AddResult(
                seriesItemId, seriesItemId,
                externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);

            MockDBUtils.AddReader(19,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, " +
                                  "T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 " +
                                  "FROM M_RELATIONSHIP T0  " +
                                  "WHERE T0.MEDIA_ITEM_ID = @V0",
                                  CreateAttributeIdList(4, 5));

            MockDBUtils.AddReader(20,
                                  "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, T0.ROLE A0, T0.LINKEDROLE A1, T0.LINKEDID A2, T0.RELATIONSHIPINDEX A3 FROM M_RELATIONSHIP T0  WHERE T0.LINKEDID IN (@V0)");

            MockReader reader20 = MockDBUtils.AddReader(21,
                                                        "SELECT MEDIA_ITEM_ID " +
                                                        "FROM M_EXTERNALIDENTIFIER " +
                                                        "WHERE MEDIA_ITEM_ID = @MEDIA_ITEM_ID AND SOURCE = @SOURCE AND TYPE = @TYPE",
                                                        "MEDIA_ITEM_ID");

            reader20.AddResult(
                seasonItemId,
                externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);

            MockDBUtils.AddReader(22,
                                  "SELECT MEDIA_ITEM_ID " +
                                  "FROM M_RELATIONSHIP " +
                                  "WHERE MEDIA_ITEM_ID = @MEDIA_ITEM_ID AND ROLE = @ROLE AND LINKEDROLE = @LINKEDROLE AND LINKEDID = @LINKEDID",
                                  "MEDIA_ITEM_ID");

            MockReader reader22 = MockDBUtils.AddReader(23,
                                                        "SELECT MEDIA_ITEM_ID " +
                                                        "FROM M_EXTERNALIDENTIFIER " +
                                                        "WHERE MEDIA_ITEM_ID = @MEDIA_ITEM_ID AND SOURCE = @SOURCE AND TYPE = @TYPE",
                                                        "MEDIA_ITEM_ID");

            reader22.AddResult(
                seasonItemId,
                externalSource, ExternalIdentifierAspect.TYPE_SERIES, externalSeriesId);

            MockDBUtils.AddReader(24,
                                  "SELECT MEDIA_ITEM_ID " +
                                  "FROM M_RELATIONSHIP " +
                                  "WHERE MEDIA_ITEM_ID = @MEDIA_ITEM_ID AND ROLE = @ROLE AND LINKEDROLE = @LINKEDROLE AND LINKEDID = @LINKEDID",
                                  "MEDIA_ITEM_ID");

            MockCore.Library.AddOrUpdateMediaItem(parentDirectoryId, systemId, path, episodeAspects.Values.SelectMany(x => x), true);

            MockCore.ShutdownLibrary();
        }
Пример #15
0
        /// <summary>
        /// Copies the contained series information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(ToString()));
            //MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, true); //Is maintained by medialibrary and metadata extractors
            MediaItemAspect.SetAttribute(aspectData, SeasonAspect.ATTR_SERIES_NAME, SeriesName.Text);
            if (!Description.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, SeasonAspect.ATTR_DESCRIPTION, CleanString(Description.Text));
            }
            if (SeasonNumber.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, SeasonAspect.ATTR_SEASON, SeasonNumber.Value);
            }
            if (FirstAired.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, FirstAired.Value);
            }
            if (TotalEpisodes > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, SeasonAspect.ATTR_NUM_EPISODES, TotalEpisodes);
            }

            if (!string.IsNullOrEmpty(ImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_SEASON, ImdbId);
            }
            if (TvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SEASON, TvdbId.ToString());
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_SEASON, MovieDbId.ToString());
            }
            if (TvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SEASON, TvMazeId.ToString());
            }
            if (TvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_SEASON, TvRageId.ToString());
            }
            foreach (var customId in CustomIds)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, customId.Key, ExternalIdentifierAspect.TYPE_SEASON, customId.Value);
            }

            if (!string.IsNullOrEmpty(SeriesImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesImdbId);
            }
            if (SeriesTvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvdbId.ToString());
            }
            if (SeriesMovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesMovieDbId.ToString());
            }
            if (SeriesTvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvMazeId.ToString());
            }
            if (SeriesTvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvRageId.ToString());
            }
            if (!string.IsNullOrEmpty(SeriesNameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_SERIES, SeriesNameId);
            }
            foreach (var customId in CustomSeriesIds)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, customId.Key, ExternalIdentifierAspect.TYPE_SERIES, customId.Value);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #16
0
        /// <summary>
        /// Copies the contained track information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            if (!string.IsNullOrEmpty(AlbumSort))
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, AlbumSort);
            }
            //MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, true); //Is maintained by medialibrary and metadataextractors
            MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_ALBUM, Album);
            MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_COMPILATION, Compilation);
            if (!Description.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_DESCRIPTION, Description.Text);
            }
            if (DiscNum > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_DISCID, DiscNum);
            }
            if (TotalDiscs > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_NUMDISCS, TotalDiscs);
            }
            if (ReleaseDate.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, ReleaseDate.Value);
            }
            if (TotalTracks > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_NUMTRACKS, TotalTracks);
            }
            if (Sales > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_SALES, Sales);
            }

            if (!string.IsNullOrEmpty(MusicBrainzId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_ALBUM, MusicBrainzId);
            }
            if (!string.IsNullOrEmpty(MusicBrainzGroupId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ_GROUP, ExternalIdentifierAspect.TYPE_ALBUM, MusicBrainzGroupId);
            }
            if (AudioDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_ALBUM, AudioDbId.ToString());
            }
            if (!string.IsNullOrEmpty(CdDdId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_CDDB, ExternalIdentifierAspect.TYPE_ALBUM, CdDdId);
            }
            if (!string.IsNullOrEmpty(UpcEanId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_UPCEAN, ExternalIdentifierAspect.TYPE_ALBUM, UpcEanId);
            }
            if (!string.IsNullOrEmpty(AmazonId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AMAZON, ExternalIdentifierAspect.TYPE_ALBUM, AmazonId);
            }
            if (!string.IsNullOrEmpty(ItunesId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_ITUNES, ExternalIdentifierAspect.TYPE_ALBUM, ItunesId);
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_ALBUM, NameId);
            }
            foreach (var customId in CustomIds)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, customId.Key, ExternalIdentifierAspect.TYPE_ALBUM, customId.Value);
            }

            if (!Rating.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_TOTAL_RATING, Rating.RatingValue.Value);
                if (Rating.VoteCount.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, AudioAlbumAspect.ATTR_RATING_COUNT, Rating.VoteCount.Value);
                }
            }

            if (Artists.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAlbumAspect.ATTR_ARTISTS, Artists.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).Distinct().ToList());
            }

            if (Awards.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAlbumAspect.ATTR_AWARDS, Awards.Where(a => !string.IsNullOrEmpty(a)).Distinct().ToList());
            }

            if (MusicLabels.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAlbumAspect.ATTR_LABELS, MusicLabels.Where(l => !string.IsNullOrEmpty(l.Name)).Select(l => l.Name).Distinct().ToList());
            }

            aspectData.Remove(GenreAspect.ASPECT_ID);
            foreach (GenreInfo genre in Genres.Distinct())
            {
                MultipleMediaItemAspect genreAspect = MediaItemAspect.CreateAspect(aspectData, GenreAspect.Metadata);
                genreAspect.SetAttribute(GenreAspect.ATTR_ID, genre.Id);
                genreAspect.SetAttribute(GenreAspect.ATTR_GENRE, genre.Name);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #17
0
        /// <summary>
        /// Copies the contained series information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData)
        {
            if (!IsBaseInfoPresent)
            {
                return(false);
            }

            SetMetadataChanged(aspectData);
            EpisodeName.Text = CleanString(EpisodeName.Text);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            if (!EpisodeNameSort.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, EpisodeNameSort.Text);
            }
            else if (!EpisodeName.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(EpisodeName.Text));
            }
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, IsVirtualResource(aspectData));
            MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_SERIES_NAME, SeriesName.Text);
            if (!EpisodeName.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_EPISODE_NAME, EpisodeName.Text);
            }
            if (SeasonNumber.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_SEASON, SeasonNumber.Value);
            }
            if (FirstAired.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, FirstAired.Value);
            }
            MediaItemAspect.SetCollectionAttribute(aspectData, EpisodeAspect.ATTR_EPISODE, EpisodeNumbers);
            MediaItemAspect.SetCollectionAttribute(aspectData, EpisodeAspect.ATTR_DVDEPISODE, DvdEpisodeNumbers);

            if (!string.IsNullOrEmpty(ImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_EPISODE, ImdbId);
            }
            if (TvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_EPISODE, TvdbId.ToString());
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_EPISODE, MovieDbId.ToString());
            }
            if (TvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_EPISODE, TvMazeId.ToString());
            }
            if (TvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_EPISODE, TvRageId.ToString());
            }

            if (!string.IsNullOrEmpty(SeriesImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesImdbId);
            }
            if (SeriesTvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvdbId.ToString());
            }
            if (SeriesMovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_SERIES, SeriesMovieDbId.ToString());
            }
            if (SeriesTvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvMazeId.ToString());
            }
            if (SeriesTvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_SERIES, SeriesTvRageId.ToString());
            }
            if (!string.IsNullOrEmpty(SeriesNameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_SERIES, SeriesNameId);
            }

            if (!Rating.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_TOTAL_RATING, Rating.RatingValue.Value);
                if (Rating.VoteCount.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_RATING_COUNT, Rating.VoteCount.Value);
                }
            }

            // Construct a "Series Season" string, which will be used for filtering and season banner retrieval.
            int    season       = SeasonNumber ?? 0;
            string seriesSeason = string.Format(SERIES_SEASON_FORMAT_STR, SeriesName, season.ToString().PadLeft(2, '0'));

            MediaItemAspect.SetAttribute(aspectData, EpisodeAspect.ATTR_SERIES_SEASON, seriesSeason);

            MediaItemAspect.SetAttribute(aspectData, VideoAspect.ATTR_ISDVD, false);
            if (!Summary.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, VideoAspect.ATTR_STORYPLOT, CleanString(Summary.Text));
            }
            if (Actors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_ACTORS, Actors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Directors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_DIRECTORS, Directors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Writers.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_WRITERS, Writers.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Characters.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_CHARACTERS, Characters.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }

            aspectData.Remove(GenreAspect.ASPECT_ID);
            foreach (GenreInfo genre in Genres.Distinct())
            {
                MultipleMediaItemAspect genreAspect = MediaItemAspect.CreateAspect(aspectData, GenreAspect.Metadata);
                genreAspect.SetAttribute(GenreAspect.ATTR_ID, genre.Id);
                genreAspect.SetAttribute(GenreAspect.ATTR_GENRE, genre.Name);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #18
0
        /// <summary>
        /// Copies the contained movie information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData)
        {
            if (MovieName.IsEmpty)
            {
                return(false);
            }

            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            if (!MovieNameSort.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, MovieNameSort.Text);
            }
            else
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(MovieName.Text));
            }
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, IsVirtualResource(aspectData));
            MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_MOVIE_NAME, MovieName.Text);
            if (!string.IsNullOrEmpty(OriginalName))
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_ORIG_MOVIE_NAME, OriginalName);
            }
            if (ReleaseDate.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, ReleaseDate.Value);
            }
            if (!Summary.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, VideoAspect.ATTR_STORYPLOT, CleanString(Summary.Text));
            }
            if (!string.IsNullOrEmpty(Tagline))
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_TAGLINE, Tagline);
            }
            if (!CollectionName.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_COLLECTION_NAME, CollectionName.Text);
            }
            if (!string.IsNullOrEmpty(Certification))
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_CERTIFICATION, Certification);
            }

            if (!string.IsNullOrEmpty(ImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_MOVIE, ImdbId);
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_MOVIE, MovieDbId.ToString());
            }
            if (AllocinebId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_ALLOCINE, ExternalIdentifierAspect.TYPE_MOVIE, AllocinebId.ToString());
            }
            if (CinePassionId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_CINEPASSION, ExternalIdentifierAspect.TYPE_MOVIE, CinePassionId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_MOVIE, NameId);
            }

            if (CollectionMovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_COLLECTION, CollectionMovieDbId.ToString());
            }
            if (!string.IsNullOrEmpty(CollectionNameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_COLLECTION, CollectionNameId);
            }

            if (Runtime > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_RUNTIME_M, Runtime);
            }
            if (Budget > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_BUDGET, Budget);
            }
            if (Revenue > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_REVENUE, Revenue);
            }

            if (Popularity > 0f)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_POPULARITY, Popularity);
            }
            if (Score > 0d)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_SCORE, Score);
            }

            if (!Rating.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_TOTAL_RATING, Rating.RatingValue.Value);
                if (Rating.VoteCount.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, MovieAspect.ATTR_RATING_COUNT, Rating.VoteCount.Value);
                }
            }

            if (Actors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_ACTORS, Actors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Directors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_DIRECTORS, Directors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Writers.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_WRITERS, Writers.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Characters.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, VideoAspect.ATTR_CHARACTERS, Characters.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }

            if (Awards.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, MovieAspect.ATTR_AWARDS, Awards.Where(a => !string.IsNullOrEmpty(a)).ToList());
            }
            if (ProductionCompanies.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, MovieAspect.ATTR_COMPANIES, ProductionCompanies.Where(c => !string.IsNullOrEmpty(c.Name)).Select(c => c.Name).ToList());
            }

            aspectData.Remove(GenreAspect.ASPECT_ID);
            foreach (GenreInfo genre in Genres.Distinct())
            {
                MultipleMediaItemAspect genreAspect = MediaItemAspect.CreateAspect(aspectData, GenreAspect.Metadata);
                genreAspect.SetAttribute(GenreAspect.ATTR_ID, genre.Id);
                genreAspect.SetAttribute(GenreAspect.ATTR_GENRE, genre.Name);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #19
0
        /// <summary>
        /// Copies the contained series information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            if (!SeriesNameSort.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, SeriesNameSort.Text);
            }
            //MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, true); //Is maintained by medialibrary and metadataextractors
            MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_SERIES_NAME, SeriesName.Text);
            if (!string.IsNullOrEmpty(OriginalName))
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_ORIG_SERIES_NAME, OriginalName);
            }
            if (FirstAired.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, FirstAired.Value);
            }
            if (!Description.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_DESCRIPTION, CleanString(Description.Text));
            }
            if (!string.IsNullOrEmpty(Certification))
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_CERTIFICATION, Certification);
            }
            MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_ENDED, IsEnded);
            if (TotalSeasons > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NUM_SEASONS, TotalSeasons);
            }
            if (TotalEpisodes > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NUM_EPISODES, TotalEpisodes);
            }

            if (NextEpisodeAirDate.HasValue)
            {
                if (!NextEpisodeName.IsEmpty)
                {
                    MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NEXT_EPISODE_NAME, NextEpisodeName.Text);
                }
                else if (NextEpisodeNumber.HasValue && NextEpisodeSeasonNumber.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NEXT_EPISODE_NAME, string.Format(NEXT_EPISODE_FORMAT_STR, SeriesName, NextEpisodeSeasonNumber.Value, NextEpisodeNumber.Value));
                }
                if (NextEpisodeSeasonNumber.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NEXT_SEASON, NextEpisodeSeasonNumber.Value);
                }
                if (NextEpisodeNumber.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NEXT_EPISODE, NextEpisodeNumber.Value);
                }
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_NEXT_AIR_DATE, NextEpisodeAirDate.Value);
            }

            if (!string.IsNullOrEmpty(ImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_SERIES, ImdbId);
            }
            if (TvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, TvdbId.ToString());
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_SERIES, MovieDbId.ToString());
            }
            if (TvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_SERIES, TvMazeId.ToString());
            }
            if (TvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_SERIES, TvRageId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_SERIES, NameId);
            }

            if (Popularity > 0f)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_POPULARITY, Popularity);
            }
            if (Score > 0d)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_SCORE, Score);
            }

            if (!Rating.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_TOTAL_RATING, Rating.RatingValue.Value);
                if (Rating.VoteCount.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, SeriesAspect.ATTR_RATING_COUNT, Rating.VoteCount.Value);
                }
            }

            if (Actors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, SeriesAspect.ATTR_ACTORS, Actors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }
            if (Characters.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, SeriesAspect.ATTR_CHARACTERS, Characters.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).ToList());
            }

            if (Awards.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, SeriesAspect.ATTR_AWARDS, Awards.Where(a => !string.IsNullOrEmpty(a)).ToList());
            }

            if (Networks.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, SeriesAspect.ATTR_NETWORKS, Networks.Where(c => !string.IsNullOrEmpty(c.Name)).Select(c => c.Name).ToList());
            }
            if (ProductionCompanies.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, SeriesAspect.ATTR_COMPANIES, ProductionCompanies.Where(c => !string.IsNullOrEmpty(c.Name)).Select(c => c.Name).ToList());
            }

            aspectData.Remove(GenreAspect.ASPECT_ID);
            foreach (GenreInfo genre in Genres.Distinct())
            {
                MultipleMediaItemAspect genreAspect = MediaItemAspect.CreateAspect(aspectData, GenreAspect.Metadata);
                genreAspect.SetAttribute(GenreAspect.ATTR_ID, genre.Id);
                genreAspect.SetAttribute(GenreAspect.ATTR_GENRE, genre.Name);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #20
0
        /// <summary>
        /// Copies the contained company information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(Name));
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, false); //Always based on physical media
            MediaItemAspect.SetAttribute(aspectData, CompanyAspect.ATTR_COMPANY_NAME, Name);
            if (!Description.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, CompanyAspect.ATTR_DESCRIPTION, CleanString(Description.Text));
            }
            MediaItemAspect.SetAttribute(aspectData, CompanyAspect.ATTR_COMPANY_TYPE, Type);

            if (Type == CompanyAspect.COMPANY_TV_NETWORK)
            {
                if (!string.IsNullOrEmpty(ImdbId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_NETWORK, ImdbId);
                }
                if (TvdbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_NETWORK, TvdbId.ToString());
                }
                if (MovieDbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_NETWORK, MovieDbId.ToString());
                }
                if (!string.IsNullOrEmpty(MusicBrainzId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_NETWORK, MusicBrainzId);
                }
                if (AudioDbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_NETWORK, AudioDbId.ToString());
                }
                if (TvMazeId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_NETWORK, TvMazeId.ToString());
                }
                if (!string.IsNullOrEmpty(NameId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_NETWORK, NameId);
                }
            }
            else
            {
                if (!string.IsNullOrEmpty(ImdbId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_COMPANY, ImdbId);
                }
                if (TvdbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_COMPANY, TvdbId.ToString());
                }
                if (MovieDbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_COMPANY, MovieDbId.ToString());
                }
                if (!string.IsNullOrEmpty(MusicBrainzId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_COMPANY, MusicBrainzId);
                }
                if (AudioDbId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_COMPANY, AudioDbId.ToString());
                }
                if (TvMazeId > 0)
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_COMPANY, TvMazeId.ToString());
                }
                if (!string.IsNullOrEmpty(NameId))
                {
                    MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_COMPANY, NameId);
                }
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #21
0
        /// <summary>
        /// Copies the contained character information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(Name));
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, false); //Always based on physical media
            MediaItemAspect.SetAttribute(aspectData, CharacterAspect.ATTR_CHARACTER_NAME, Name);
            if (!string.IsNullOrEmpty(ActorName))
            {
                MediaItemAspect.SetAttribute(aspectData, CharacterAspect.ATTR_ACTOR_NAME, ActorName);
            }

            if (TvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_CHARACTER, TvdbId.ToString());
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_CHARACTER, MovieDbId.ToString());
            }
            if (TvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_CHARACTER, TvMazeId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_CHARACTER, NameId);
            }

            if (ActorTvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_PERSON, ActorTvdbId.ToString());
            }
            if (ActorMovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_PERSON, ActorMovieDbId.ToString());
            }
            if (ActorTvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_PERSON, ActorTvMazeId.ToString());
            }
            if (ActorTvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_PERSON, ActorTvRageId.ToString());
            }
            if (!string.IsNullOrEmpty(ActorImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_PERSON, ActorImdbId);
            }
            if (!string.IsNullOrEmpty(ActorNameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_PERSON, ActorNameId);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
        /// <summary>
        /// Asynchronously tries to extract episode metadata for the given <param name="mediaItemAccessor"></param>
        /// </summary>
        /// <param name="mediaItemAccessor">Points to the resource for which we try to extract metadata</param>
        /// <param name="extractedAspectData">Dictionary of <see cref="MediaItemAspect"/>s with the extracted metadata</param>
        /// <param name="forceQuickMode">If <c>true</c>, nothing is downloaded from the internet</param>
        /// <returns><c>true</c> if metadata was found and stored into <param name="extractedAspectData"></param>, else <c>false</c></returns>
        private async Task <bool> TryExtractEpsiodeMetadataAsync(IResourceAccessor mediaItemAccessor, IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData, bool forceQuickMode)
        {
            // Get a unique number for this call to TryExtractMetadataAsync. We use this to make reading the debug log easier.
            // This MetadataExtractor is called in parallel for multiple MediaItems so that the respective debug log entries
            // for one call are not contained one after another in debug log. We therefore prepend this number before every log entry.
            var  miNumber = Interlocked.Increment(ref _lastMediaItemNumber);
            bool isStub   = extractedAspectData.ContainsKey(StubAspect.ASPECT_ID);

            try
            {
                _debugLogger.Info("[#{0}]: Start extracting metadata for resource '{1}' (forceQuickMode: {2})", miNumber, mediaItemAccessor, forceQuickMode);

                // This MetadataExtractor only works for MediaItems accessible by an IFileSystemResourceAccessor.
                // Otherwise it is not possible to find a nfo-file in the MediaItem's directory or parent directory.
                if (!(mediaItemAccessor is IFileSystemResourceAccessor))
                {
                    _debugLogger.Info("[#{0}]: Cannot extract metadata; mediaItemAccessor is not an IFileSystemResourceAccessor", miNumber);
                    return(false);
                }

                // We only extract metadata with this MetadataExtractor, if another MetadataExtractor that was applied before
                // has identified this MediaItem as a video and therefore added a VideoAspect.
                if (!extractedAspectData.ContainsKey(VideoAspect.ASPECT_ID))
                {
                    _debugLogger.Info("[#{0}]: Cannot extract metadata; this resource is not a video", miNumber);
                    return(false);
                }

                // Here we try to find an IFileSystemResourceAccessor pointing to the episode nfo-file.
                // If we don't find one, we cannot extract any metadata.
                IFileSystemResourceAccessor episodeNfoFsra;
                NfoSeriesEpisodeReader      episodeNfoReader = null;
                bool episodeDetailsFound = false;
                if (TryGetEpisodeNfoSResourceAccessor(miNumber, mediaItemAccessor as IFileSystemResourceAccessor, out episodeNfoFsra))
                {
                    episodeDetailsFound = true;
                    // Now we (asynchronously) extract the metadata into a stub object.
                    // If no metadata was found, nothing can be stored in the MediaItemAspects.
                    episodeNfoReader = new NfoSeriesEpisodeReader(_debugLogger, miNumber, forceQuickMode, isStub, _httpClient, _settings, false);
                    using (episodeNfoFsra)
                    {
                        if (!await episodeNfoReader.TryReadMetadataAsync(episodeNfoFsra).ConfigureAwait(false))
                        {
                            _debugLogger.Warn("[#{0}]: No valid metadata found in episode nfo-file", miNumber);
                            return(false);
                        }
                    }
                }

                // Then we try to find an IFileSystemResourceAccessor pointing to the series nfo-file.
                IFileSystemResourceAccessor seriesNfoFsra;
                if (TryGetSeriesNfoSResourceAccessor(miNumber, mediaItemAccessor as IFileSystemResourceAccessor, out seriesNfoFsra))
                {
                    // If we found one, we (asynchronously) extract the metadata into a stub object and, if metadata was found,
                    // we store it into the episodeNfoReader so that the latter can store metadata from series and episode level into the MediaItemAspects.
                    var seriesNfoReader = new NfoSeriesReader(_debugLogger, miNumber, forceQuickMode, !episodeDetailsFound, isStub, _httpClient, _settings, false);
                    using (seriesNfoFsra)
                    {
                        if (await seriesNfoReader.TryReadMetadataAsync(seriesNfoFsra).ConfigureAwait(false))
                        {
                            //Check reimport
                            if (extractedAspectData.ContainsKey(ReimportAspect.ASPECT_ID))
                            {
                                SeriesInfo reimport = new SeriesInfo();
                                reimport.FromMetadata(extractedAspectData);
                                if (!VerifySeriesReimport(seriesNfoReader, reimport))
                                {
                                    ServiceRegistration.Get <ILogger>().Info("NfoSeriesMetadataExtractor: Nfo series metadata from resource '{0}' ignored because it does not match reimport {1}", mediaItemAccessor, reimport);
                                    return(false);
                                }
                            }

                            Stubs.SeriesStub series = seriesNfoReader.GetSeriesStubs().FirstOrDefault();

                            // Check if episode should be found
                            if (isStub || !episodeDetailsFound)
                            {
                                if (series != null && series.Episodes?.Count > 0)
                                {
                                    List <Stubs.SeriesEpisodeStub> episodeStubs = null;
                                    if (extractedAspectData.ContainsKey(EpisodeAspect.ASPECT_ID))
                                    {
                                        int?        seasonNo = 0;
                                        IEnumerable episodes;
                                        if (MediaItemAspect.TryGetAttribute(extractedAspectData, EpisodeAspect.ATTR_SEASON, out seasonNo) && MediaItemAspect.TryGetAttribute(extractedAspectData, EpisodeAspect.ATTR_EPISODE, out episodes))
                                        {
                                            List <int> episodeNos = new List <int>();
                                            CollectionUtils.AddAll(episodeNos, episodes.Cast <int>());

                                            if (seasonNo.HasValue && episodeNos.Count > 0)
                                            {
                                                episodeStubs = series.Episodes.Where(e => e.Season == seasonNo.Value && episodeNos.Intersect(e.Episodes).Any()).ToList();
                                            }
                                        }
                                    }
                                    else
                                    {
                                        string title = null;
                                        if (MediaItemAspect.TryGetAttribute(extractedAspectData, MediaAspect.ATTR_TITLE, out title))
                                        {
                                            Regex regex = new Regex(@"(?<series>[^\\]+).S(?<seasonnum>\d+)[\s|\.|\-|_]{0,1}E((?<episodenum>\d+)_?)+(?<episode>.*)");
                                            Match match = regex.Match(title);

                                            if (match.Success && match.Groups["seasonnum"].Length > 0 && match.Groups["episodenum"].Length > 0)
                                            {
                                                episodeStubs = series.Episodes.Where(e => e.Season == Convert.ToInt32(match.Groups["seasonnum"].Value) && e.Episodes.Contains(Convert.ToInt32(match.Groups["episodenum"].Value))).ToList();
                                            }
                                        }
                                    }
                                    if (episodeStubs != null && episodeStubs.Count > 0)
                                    {
                                        Stubs.SeriesEpisodeStub mergedEpisode = null;
                                        if (isStub)
                                        {
                                            if (episodeStubs.Count == 1)
                                            {
                                                mergedEpisode = episodeStubs.First();
                                            }
                                            else
                                            {
                                                Stubs.SeriesEpisodeStub episode = episodeStubs.First();
                                                mergedEpisode                      = new Stubs.SeriesEpisodeStub();
                                                mergedEpisode.Actors               = episode.Actors;
                                                mergedEpisode.Aired                = episode.Aired;
                                                mergedEpisode.Credits              = episode.Credits;
                                                mergedEpisode.Director             = episode.Director;
                                                mergedEpisode.DisplayEpisode       = episode.DisplayEpisode;
                                                mergedEpisode.DisplaySeason        = episode.DisplaySeason;
                                                mergedEpisode.EpBookmark           = episode.EpBookmark;
                                                mergedEpisode.FileInfo             = episode.FileInfo;
                                                mergedEpisode.LastPlayed           = episode.LastPlayed;
                                                mergedEpisode.Mpaa                 = episode.Mpaa;
                                                mergedEpisode.PlayCount            = episode.PlayCount;
                                                mergedEpisode.Premiered            = episode.Premiered;
                                                mergedEpisode.ProductionCodeNumber = episode.ProductionCodeNumber;
                                                mergedEpisode.ResumePosition       = episode.ResumePosition;
                                                mergedEpisode.Season               = episode.Season;
                                                mergedEpisode.Sets                 = episode.Sets;
                                                mergedEpisode.ShowTitle            = episode.ShowTitle;
                                                mergedEpisode.Status               = episode.Status;
                                                mergedEpisode.Studio               = episode.Studio;
                                                mergedEpisode.Tagline              = episode.Tagline;
                                                mergedEpisode.Thumb                = episode.Thumb;
                                                mergedEpisode.Top250               = episode.Top250;
                                                mergedEpisode.Trailer              = episode.Trailer;
                                                mergedEpisode.Watched              = episode.Watched;
                                                mergedEpisode.Year                 = episode.Year;
                                                mergedEpisode.Id                   = episode.Id;
                                                mergedEpisode.UniqueId             = episode.UniqueId;

                                                //Merge episodes
                                                mergedEpisode.Title   = string.Join("; ", episodeStubs.OrderBy(e => e.Episodes.First()).Select(e => e.Title).ToArray());
                                                mergedEpisode.Rating  = episodeStubs.Where(e => e.Rating.HasValue).Sum(e => e.Rating.Value) / episodeStubs.Where(e => e.Rating.HasValue).Count(); // Average rating
                                                mergedEpisode.Votes   = episodeStubs.Where(e => e.Votes.HasValue).Sum(e => e.Votes.Value) / episodeStubs.Where(e => e.Votes.HasValue).Count();
                                                mergedEpisode.Runtime = TimeSpan.FromSeconds(episodeStubs.Where(e => e.Runtime.HasValue).Sum(e => e.Runtime.Value.TotalSeconds));
                                                mergedEpisode.Plot    = string.Join("\r\n\r\n", episodeStubs.OrderBy(e => e.Episodes.First()).
                                                                                    Select(e => string.Format("{0,02}) {1}", e.Episodes.First(), e.Plot)).ToArray());
                                                mergedEpisode.Outline = string.Join("\r\n\r\n", episodeStubs.OrderBy(e => e.Episodes.First()).
                                                                                    Select(e => string.Format("{0,02}) {1}", e.Episodes.First(), e.Outline)).ToArray());
                                                mergedEpisode.Episodes    = new HashSet <int>(episodeStubs.SelectMany(x => x.Episodes).ToList());
                                                mergedEpisode.DvdEpisodes = new HashSet <decimal>(episodeStubs.SelectMany(x => x.DvdEpisodes).ToList());
                                            }

                                            IList <MultipleMediaItemAspect> providerResourceAspects;
                                            if (MediaItemAspect.TryGetAspects(extractedAspectData, ProviderResourceAspect.Metadata, out providerResourceAspects))
                                            {
                                                MultipleMediaItemAspect providerResourceAspect = providerResourceAspects.First(pa => pa.GetAttributeValue <int>(ProviderResourceAspect.ATTR_TYPE) == ProviderResourceAspect.TYPE_STUB);
                                                string mime = null;
                                                if (mergedEpisode.FileInfo != null && mergedEpisode.FileInfo.Count > 0)
                                                {
                                                    mime = MimeTypeDetector.GetMimeTypeFromExtension("file" + mergedEpisode.FileInfo.First().Container);
                                                }
                                                if (mime != null)
                                                {
                                                    providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_MIME_TYPE, mime);
                                                }
                                            }

                                            MediaItemAspect.SetAttribute(extractedAspectData, MediaAspect.ATTR_TITLE, string.Format("{0} S{1:00}{2} {3}", series.ShowTitle, mergedEpisode.Season, mergedEpisode.Episodes.Select(e => "E" + e.ToString("00")), mergedEpisode.Title));
                                            MediaItemAspect.SetAttribute(extractedAspectData, MediaAspect.ATTR_SORT_TITLE, BaseInfo.GetSortTitle(mergedEpisode.Title));
                                            MediaItemAspect.SetAttribute(extractedAspectData, MediaAspect.ATTR_RECORDINGTIME, mergedEpisode.Premiered.HasValue ? mergedEpisode.Premiered.Value : mergedEpisode.Year.HasValue ? mergedEpisode.Year.Value : (DateTime?)null);

                                            if (mergedEpisode.FileInfo != null && mergedEpisode.FileInfo.Count > 0)
                                            {
                                                extractedAspectData.Remove(VideoStreamAspect.ASPECT_ID);
                                                extractedAspectData.Remove(VideoAudioStreamAspect.ASPECT_ID);
                                                extractedAspectData.Remove(SubtitleAspect.ASPECT_ID);
                                                StubParser.ParseFileInfo(extractedAspectData, mergedEpisode.FileInfo, mergedEpisode.Title);
                                            }
                                        }

                                        episodeNfoReader = new NfoSeriesEpisodeReader(_debugLogger, miNumber, forceQuickMode, isStub, _httpClient, _settings, false);
                                        episodeNfoReader.SetEpisodeStubs(new List <Stubs.SeriesEpisodeStub> {
                                            mergedEpisode
                                        });
                                    }
                                }
                            }
                            if (series != null)
                            {
                                if (episodeNfoReader != null)
                                {
                                    episodeNfoReader.SetSeriesStubs(new List <Stubs.SeriesStub> {
                                        series
                                    });

                                    // Then we store the found metadata in the MediaItemAspects. If we only found metadata that is
                                    // not (yet) supported by our MediaItemAspects, this MetadataExtractor returns false.
                                    if (!episodeNfoReader.TryWriteMetadata(extractedAspectData))
                                    {
                                        _debugLogger.Warn("[#{0}]: No metadata was written into MediaItemsAspects", miNumber);
                                        return(false);
                                    }
                                }
                                else
                                {
                                    if (!string.IsNullOrEmpty(series.ShowTitle))
                                    {
                                        MediaItemAspect.SetAttribute(extractedAspectData, EpisodeAspect.ATTR_SERIES_NAME, series.ShowTitle);
                                    }
                                    if (series.Id.HasValue)
                                    {
                                        MediaItemAspect.AddOrUpdateExternalIdentifier(extractedAspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, series.Id.Value.ToString());
                                    }
                                }
                            }
                        }
                        else
                        {
                            _debugLogger.Warn("[#{0}]: No valid metadata found in series nfo-file", miNumber);
                        }
                    }
                }
                else if (episodeNfoReader != null)
                {
                    //Check reimport
                    if (extractedAspectData.ContainsKey(ReimportAspect.ASPECT_ID))
                    {
                        EpisodeInfo reimport = new EpisodeInfo();
                        reimport.FromMetadata(extractedAspectData);
                        if (!VerifyEpisodeReimport(episodeNfoReader, reimport))
                        {
                            ServiceRegistration.Get <ILogger>().Info("NfoSeriesMetadataExtractor: Nfo episode metadata from resource '{0}' ignored because it does not match reimport {1}", mediaItemAccessor, reimport);
                            return(false);
                        }
                    }

                    // Then we store the found metadata in the MediaItemAspects. If we only found metadata that is
                    // not (yet) supported by our MediaItemAspects, this MetadataExtractor returns false.
                    if (!episodeNfoReader.TryWriteMetadata(extractedAspectData))
                    {
                        _debugLogger.Warn("[#{0}]: No metadata was written into MediaItemsAspects", miNumber);
                        return(false);
                    }
                }

                _debugLogger.Info("[#{0}]: Successfully finished extracting metadata", miNumber);
                ServiceRegistration.Get <ILogger>().Debug("NfoSeriesMetadataExtractor: Assigned nfo episode metadata for resource '{0}'", mediaItemAccessor);
                return(true);
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Warn("NfoSeriesMetadataExtractor: Exception while extracting metadata for resource '{0}'; enable debug logging for more details.", mediaItemAccessor);
                _debugLogger.Error("[#{0}]: Exception while extracting metadata", e, miNumber);
                return(false);
            }
        }
Пример #23
0
        /// <summary>
        /// Copies the contained track information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            if (!string.IsNullOrEmpty(TrackNameSort))
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, TrackNameSort);
            }
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, IsVirtualResource(aspectData));
            MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_TRACKNAME, TrackName);
            MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_COMPILATION, Compilation);
            if (!string.IsNullOrEmpty(TrackLyrics))
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_LYRICS, TrackLyrics);
            }
            if (ReleaseDate.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_RECORDINGTIME, ReleaseDate.Value);
            }
            if (TrackNum > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_TRACK, TrackNum);
            }
            if (TotalTracks > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_NUMTRACKS, TotalTracks);
            }
            if (Duration > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_DURATION, Duration);
            }

            bool?isCd;

            if (!MediaItemAspect.TryGetAttribute(aspectData, AudioAspect.ATTR_ISCD, out isCd) || !isCd.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_ISCD, false);
            }

            if (!string.IsNullOrEmpty(MusicBrainzId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_TRACK, MusicBrainzId);
            }
            if (!string.IsNullOrEmpty(IsrcId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_ISRC, ExternalIdentifierAspect.TYPE_TRACK, IsrcId);
            }
            if (!string.IsNullOrEmpty(MusicIpId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSIC_IP, ExternalIdentifierAspect.TYPE_TRACK, MusicIpId);
            }
            if (AudioDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_TRACK, AudioDbId.ToString());
            }
            if (LyricId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_LYRIC, ExternalIdentifierAspect.TYPE_TRACK, LyricId.ToString());
            }
            if (MvDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MVDB, ExternalIdentifierAspect.TYPE_TRACK, MvDbId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_TRACK, NameId);
            }

            if (!string.IsNullOrEmpty(Album))
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_ALBUM, Album);
            }
            if (DiscNum > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_DISCID, DiscNum);
            }
            if (TotalDiscs > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_NUMDISCS, TotalDiscs);
            }
            if (BitRate > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_BITRATE, BitRate);
            }
            if (Channels > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_CHANNELS, Channels);
            }
            if (SampleRate > 0)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_SAMPLERATE, SampleRate);
            }
            if (!string.IsNullOrEmpty(Encoding))
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_ENCODING, Encoding);
            }
            if (!string.IsNullOrEmpty(ContentGroup))
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_CONTENT_GROUP, ContentGroup);
            }

            if (!Rating.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_TOTAL_RATING, Rating.RatingValue.Value);
                if (Rating.VoteCount.HasValue)
                {
                    MediaItemAspect.SetAttribute(aspectData, AudioAspect.ATTR_RATING_COUNT, Rating.VoteCount.Value);
                }
            }

            if (!string.IsNullOrEmpty(AlbumUpcEanId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_UPCEAN, ExternalIdentifierAspect.TYPE_ALBUM, AlbumUpcEanId);
            }
            if (!string.IsNullOrEmpty(AlbumCdDdId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_CDDB, ExternalIdentifierAspect.TYPE_ALBUM, AlbumCdDdId);
            }
            if (!string.IsNullOrEmpty(AlbumMusicBrainzId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_ALBUM, AlbumMusicBrainzId);
            }
            if (!string.IsNullOrEmpty(AlbumMusicBrainzGroupId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ_GROUP, ExternalIdentifierAspect.TYPE_ALBUM, AlbumMusicBrainzGroupId);
            }
            if (AlbumAudioDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_ALBUM, AlbumAudioDbId.ToString());
            }
            if (!string.IsNullOrEmpty(AlbumAmazonId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AMAZON, ExternalIdentifierAspect.TYPE_ALBUM, AlbumAmazonId);
            }
            if (!string.IsNullOrEmpty(AlbumItunesId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_ITUNES, ExternalIdentifierAspect.TYPE_ALBUM, AlbumItunesId);
            }
            if (!string.IsNullOrEmpty(AlbumNameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_ALBUM, AlbumNameId);
            }

            if (Artists.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAspect.ATTR_ARTISTS, Artists.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).Distinct().ToList());
            }
            if (AlbumArtists.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAspect.ATTR_ALBUMARTISTS, AlbumArtists.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).Distinct().ToList());
            }
            if (Composers.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAspect.ATTR_COMPOSERS, Composers.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).Distinct().ToList());
            }
            if (Conductors.Count > 0)
            {
                MediaItemAspect.SetCollectionAttribute(aspectData, AudioAspect.ATTR_CONDUCTERS, Conductors.Where(p => !string.IsNullOrEmpty(p.Name)).Select(p => p.Name).Distinct().ToList());
            }

            aspectData.Remove(GenreAspect.ASPECT_ID);
            foreach (GenreInfo genre in Genres.Distinct())
            {
                MultipleMediaItemAspect genreAspect = MediaItemAspect.CreateAspect(aspectData, GenreAspect.Metadata);
                genreAspect.SetAttribute(GenreAspect.ATTR_ID, genre.Id);
                genreAspect.SetAttribute(GenreAspect.ATTR_GENRE, genre.Name);
            }

            SetThumbnailMetadata(aspectData);

            return(true);
        }
Пример #24
0
        /// <summary>
        /// Copies the contained person information into MediaItemAspect.
        /// </summary>
        /// <param name="aspectData">Dictionary with extracted aspects.</param>
        public override bool SetMetadata(IDictionary <Guid, IList <MediaItemAspect> > aspectData, bool force = false)
        {
            if (!force && !IsBaseInfoPresent)
            {
                return(false);
            }

            AssignNameId();
            SetMetadataChanged(aspectData);

            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_TITLE, ToString());
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_SORT_TITLE, GetSortTitle(Name));
            MediaItemAspect.SetAttribute(aspectData, MediaAspect.ATTR_ISVIRTUAL, false); //Always based on physical media
            MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_PERSON_NAME, Name);
            if (!Biography.IsEmpty)
            {
                MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_BIOGRAPHY, CleanString(Biography.Text));
            }
            if (!string.IsNullOrEmpty(Orign))
            {
                MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_ORIGIN, Orign);
            }
            MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_OCCUPATION, Occupation);

            if (!string.IsNullOrEmpty(ImdbId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_PERSON, ImdbId);
            }
            if (TvdbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_PERSON, TvdbId.ToString());
            }
            if (MovieDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_PERSON, MovieDbId.ToString());
            }
            if (!string.IsNullOrEmpty(MusicBrainzId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_MUSICBRAINZ, ExternalIdentifierAspect.TYPE_PERSON, MusicBrainzId);
            }
            if (AudioDbId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_AUDIODB, ExternalIdentifierAspect.TYPE_PERSON, AudioDbId.ToString());
            }
            if (TvMazeId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVMAZE, ExternalIdentifierAspect.TYPE_PERSON, TvMazeId.ToString());
            }
            if (TvRageId > 0)
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_TVRAGE, ExternalIdentifierAspect.TYPE_PERSON, TvRageId.ToString());
            }
            if (!string.IsNullOrEmpty(NameId))
            {
                MediaItemAspect.AddOrUpdateExternalIdentifier(aspectData, ExternalIdentifierAspect.SOURCE_NAME, ExternalIdentifierAspect.TYPE_PERSON, NameId);
            }

            if (DateOfBirth.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_DATEOFBIRTH, DateOfBirth.Value);
            }
            if (DateOfDeath.HasValue)
            {
                MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_DATEOFDEATH, DateOfDeath.Value);
            }
            MediaItemAspect.SetAttribute(aspectData, PersonAspect.ATTR_GROUP, IsGroup);

            SetThumbnailMetadata(aspectData);

            return(true);
        }