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); }
/// <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); }
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); }
/// <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); }
/// <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); }
/// <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); }
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)); }
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); }
public MockedDatabaseMovie(string imdbId, string tmdbId, string title, int year, int playPercentage) { IDictionary <Guid, IList <MediaItemAspect> > movieAspects = new Dictionary <Guid, IList <MediaItemAspect> >(); MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata); resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + title + ".mkv"); MediaItemAspect.AddOrUpdateAspect(movieAspects, resourceAspect); MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_MOVIE, imdbId); MediaItemAspect.AddOrUpdateExternalIdentifier(movieAspects, ExternalIdentifierAspect.SOURCE_TMDB, ExternalIdentifierAspect.TYPE_MOVIE, tmdbId); MediaItemAspect.SetAttribute(movieAspects, MovieAspect.ATTR_MOVIE_NAME, title); SingleMediaItemAspect smia = new SingleMediaItemAspect(MediaAspect.Metadata); smia.SetAttribute(MediaAspect.ATTR_RECORDINGTIME, new DateTime(year, 1, 1)); MediaItemAspect.SetAspect(movieAspects, smia); IDictionary <string, string> userData = new Dictionary <string, string>(); userData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, playPercentage.ToString()); Movie = new MediaItem(Guid.NewGuid(), movieAspects, userData); }
public void 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"); }
public MockedDatabaseEpisode(string tvDbId, int seasonIndex, List <int> episodeIndex, int playPercentage) { IDictionary <Guid, IList <MediaItemAspect> > episodeAspects = new Dictionary <Guid, IList <MediaItemAspect> >(); MultipleMediaItemAspect resourceAspect = new MultipleMediaItemAspect(ProviderResourceAspect.Metadata); resourceAspect.SetAttribute(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "c:\\" + tvDbId + ".mkv"); MediaItemAspect.AddOrUpdateAspect(episodeAspects, resourceAspect); MediaItemAspect.AddOrUpdateExternalIdentifier(episodeAspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, tvDbId); MediaItemAspect.SetAttribute(episodeAspects, EpisodeAspect.ATTR_SEASON, seasonIndex); MediaItemAspect.SetCollectionAttribute(episodeAspects, EpisodeAspect.ATTR_EPISODE, episodeIndex); SingleMediaItemAspect smia = new SingleMediaItemAspect(MediaAspect.Metadata); MediaItemAspect.SetAspect(episodeAspects, smia); IDictionary <string, string> userData = new Dictionary <string, string>(); userData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, playPercentage.ToString()); Episode = new MediaItem(Guid.NewGuid(), episodeAspects, userData); }
public 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(); }
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); }
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(); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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); }
/// <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); }