public override async Task <List <EpisodeInfo> > SearchSeriesEpisodeAsync(EpisodeInfo episodeSearch, string language) { SeriesInfo seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (episodeSearch.SeriesTvMazeId <= 0) { if (!await SearchSeriesUniqueAndUpdateAsync(seriesSearch, language).ConfigureAwait(false)) { return(null); } episodeSearch.CopyIdsFrom(seriesSearch); } List <EpisodeInfo> episodes = null; if (episodeSearch.SeriesTvMazeId > 0 && episodeSearch.SeasonNumber.HasValue) { TvMazeSeries seriesDetail = await _tvMazeHandler.GetSeriesAsync(episodeSearch.SeriesTvMazeId, false).ConfigureAwait(false); List <TvMazeEpisode> seasonEpisodes = null; if (seriesDetail.Embedded != null && seriesDetail.Embedded.Episodes != null) { seasonEpisodes = seriesDetail.Embedded.Episodes.Where(s => s.SeasonNumber == episodeSearch.SeasonNumber.Value).ToList(); } foreach (TvMazeEpisode episode in seasonEpisodes) { if (episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber) || episodeSearch.EpisodeNumbers.Count == 0) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo() { TvMazeId = episode.Id, SeriesName = seriesSearch.SeriesName, SeasonNumber = episode.SeasonNumber, EpisodeName = new SimpleTitle(episode.Name, true), DataProviders = new List <string>() { _name } }; info.EpisodeNumbers.Add(episode.EpisodeNumber); info.CopyIdsFrom(seriesSearch); episodes.Add(info); } } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo() { SeriesName = seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, DataProviders = new List <string>() { _name } }; info.CopyIdsFrom(seriesSearch); info.EpisodeNumbers = info.EpisodeNumbers.Union(episodeSearch.EpisodeNumbers).ToList(); episodes.Add(info); } return(episodes); }
public override bool SearchSeriesEpisode(EpisodeInfo episodeSearch, string language, out List <EpisodeInfo> episodes) { episodes = null; SeriesInfo seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (episodeSearch.SeriesTvMazeId <= 0) { if (!SearchSeriesUniqueAndUpdate(seriesSearch, language)) { return(false); } episodeSearch.CopyIdsFrom(seriesSearch); } if (episodeSearch.SeriesTvMazeId > 0 && episodeSearch.SeasonNumber.HasValue) { TvMazeSeries seriesDetail = _tvMazeHandler.GetSeries(episodeSearch.SeriesTvMazeId, false); List <TvMazeEpisode> seasonEpisodes = null; if (seriesDetail.Embedded != null && seriesDetail.Embedded.Episodes != null) { seasonEpisodes = seriesDetail.Embedded.Episodes.Where(s => s.SeasonNumber == episodeSearch.SeasonNumber.Value).ToList(); } foreach (TvMazeEpisode episode in seasonEpisodes) { if (episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber) || episodeSearch.EpisodeNumbers.Count == 0) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo() { TvMazeId = episode.Id, SeriesName = seriesSearch.SeriesName, SeasonNumber = episode.SeasonNumber, EpisodeName = new SimpleTitle(episode.Name, true), }; info.EpisodeNumbers.Add(episode.EpisodeNumber); info.CopyIdsFrom(seriesSearch); episodes.Add(info); } } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo() { SeriesName = seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, }; info.CopyIdsFrom(seriesSearch); CollectionUtils.AddAll(info.EpisodeNumbers, episodeSearch.EpisodeNumbers); episodes.Add(info); return(true); } return(episodes != null); }
public override bool SearchSeriesEpisode(EpisodeInfo episodeSearch, string language, out List <EpisodeInfo> episodes) { episodes = null; SeriesInfo seriesSearch = null; if (string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) { seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (!SearchSeriesUniqueAndUpdate(seriesSearch, language)) { return(false); } episodeSearch.CopyIdsFrom(seriesSearch); } if (!string.IsNullOrEmpty(episodeSearch.SeriesImdbId) && episodeSearch.SeasonNumber.HasValue) { OmDbSeason season = _omDbHandler.GetSeriesSeason(episodeSearch.SeriesImdbId, episodeSearch.SeasonNumber.Value, false); if (season != null && season.Episodes != null) { foreach (OmDbSeasonEpisode episode in season.Episodes) { if ((episode.EpisodeNumber.HasValue && episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber.Value)) || episodeSearch.EpisodeNumbers.Count == 0) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo() { ImdbId = episode.ImdbID, SeriesName = new SimpleTitle(season.Title, true), SeasonNumber = episodeSearch.SeasonNumber.Value, EpisodeName = new SimpleTitle(episode.Title, false), }; if (episode.EpisodeNumber.HasValue) { info.EpisodeNumbers.Add(episode.EpisodeNumber.Value); } info.CopyIdsFrom(episodeSearch.CloneBasicInstance <SeriesInfo>()); episodes.Add(info); } } } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo() { SeriesName = seriesSearch == null ? episodeSearch.SeriesName : seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, }; info.CopyIdsFrom(seriesSearch); CollectionUtils.AddAll(info.EpisodeNumbers, episodeSearch.EpisodeNumbers); episodes.Add(info); return(true); } return(episodes != null); }
public override async Task <List <EpisodeInfo> > SearchSeriesEpisodeAsync(EpisodeInfo episodeSearch, TvdbLanguage language) { language = language ?? PreferredLanguage; SeriesInfo seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (episodeSearch.SeriesTvdbId <= 0 && string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) { if (!await SearchSeriesUniqueAndUpdateAsync(seriesSearch, language).ConfigureAwait(false)) { return(null); } episodeSearch.CopyIdsFrom(seriesSearch); } List <EpisodeInfo> episodes = null; if ((episodeSearch.SeriesTvdbId > 0 || !string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) && episodeSearch.SeasonNumber.HasValue) { int seriesId = 0; if (episodeSearch.SeriesTvdbId > 0) { seriesId = episodeSearch.SeriesTvdbId; } else if (!string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) { TvdbSearchResult searchResult = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, episodeSearch.SeriesImdbId); if (searchResult?.Id > 0) { seriesId = searchResult.Id; } } TvdbSeries seriesDetail = await _tvdbHandler.GetSeriesAsync(seriesId, language, true, false, false).ConfigureAwait(false); if (seriesDetail == null) { return(null); } foreach (TvdbEpisode episode in seriesDetail.Episodes.OrderByDescending(e => e.Id)) { if ((episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber) || episodeSearch.EpisodeNumbers.Count == 0) && (episodeSearch.SeasonNumber == episode.SeasonNumber || episodeSearch.SeasonNumber.HasValue == false)) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo { TvdbId = episode.Id, SeriesName = new SimpleTitle(seriesDetail.SeriesName, false), SeasonNumber = episode.SeasonNumber, EpisodeName = new SimpleTitle(episode.EpisodeName, false), }; info.EpisodeNumbers.Add(episode.EpisodeNumber); info.CopyIdsFrom(seriesSearch); info.Languages.Add(episode.Language.Abbriviation); if (!episodes.Contains(info)) { episodes.Add(info); } } } if (episodes != null) { episodes.Sort(); } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo { SeriesName = seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, }; info.CopyIdsFrom(seriesSearch); info.EpisodeNumbers = info.EpisodeNumbers.Union(episodeSearch.EpisodeNumbers).ToList(); info.Languages = seriesSearch.Languages; episodes.Add(info); } return(episodes); }
public override async Task <List <EpisodeInfo> > SearchSeriesEpisodeAsync(EpisodeInfo episodeSearch, string language) { SeriesInfo seriesSearch = null; if (string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) { seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (!await SearchSeriesUniqueAndUpdateAsync(seriesSearch, language)) { return(null); } episodeSearch.CopyIdsFrom(seriesSearch); } List <EpisodeInfo> episodes = null; if (!string.IsNullOrEmpty(episodeSearch.SeriesImdbId) && episodeSearch.SeasonNumber.HasValue) { OmDbSeason season = await _omDbHandler.GetSeriesSeasonAsync(episodeSearch.SeriesImdbId, episodeSearch.SeasonNumber.Value, false).ConfigureAwait(false); if (season != null && season.Episodes != null) { foreach (OmDbSeasonEpisode episode in season.Episodes) { if ((episode.EpisodeNumber.HasValue && episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber.Value)) || episodeSearch.EpisodeNumbers.Count == 0) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo() { ImdbId = episode.ImdbID, SeriesName = new SimpleTitle(season.Title, true), SeasonNumber = episodeSearch.SeasonNumber.Value, EpisodeName = new SimpleTitle(episode.Title, false), }; if (episode.EpisodeNumber.HasValue) { info.EpisodeNumbers.Add(episode.EpisodeNumber.Value); } info.CopyIdsFrom(episodeSearch.CloneBasicInstance <SeriesInfo>()); episodes.Add(info); } } } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo() { SeriesName = seriesSearch == null ? episodeSearch.SeriesName : seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, }; info.CopyIdsFrom(seriesSearch); info.EpisodeNumbers = info.EpisodeNumbers.Union(episodeSearch.EpisodeNumbers).ToList(); episodes.Add(info); } return(episodes); }
protected async Task <bool> ExtractSeriesDataAsync(ILocalFsResourceAccessor lfsra, IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData) { // VideoAspect must be present to be sure it is actually a video resource. if (!extractedAspectData.ContainsKey(VideoAspect.ASPECT_ID) && !extractedAspectData.ContainsKey(SubtitleAspect.ASPECT_ID)) { return(false); } bool isReimport = extractedAspectData.ContainsKey(ReimportAspect.ASPECT_ID); EpisodeInfo episodeInfo = new EpisodeInfo(); episodeInfo.FromMetadata(extractedAspectData); if (!isReimport) //Ignore file based information for reimports because they might be the cause of the wrong match { // If there was no complete match, yet, try to get extended information out of matroska files) if (!episodeInfo.IsBaseInfoPresent || !episodeInfo.HasExternalId) { try { MatroskaMatcher matroskaMatcher = new MatroskaMatcher(); if (await matroskaMatcher.MatchSeriesAsync(lfsra, episodeInfo).ConfigureAwait(false)) { ServiceRegistration.Get <ILogger>().Debug("ExtractSeriesData: Found EpisodeInfo by MatroskaMatcher for {0}, IMDB {1}, TVDB {2}, TMDB {3}, AreReqiredFieldsFilled {4}", episodeInfo.SeriesName, episodeInfo.SeriesImdbId, episodeInfo.SeriesTvdbId, episodeInfo.SeriesMovieDbId, episodeInfo.IsBaseInfoPresent); } } catch (Exception ex) { ServiceRegistration.Get <ILogger>().Debug("ExtractSeriesData: Exception reading matroska tags for '{0}'", ex, lfsra.CanonicalLocalResourcePath); } } // If no information was found before, try name matching if (!episodeInfo.IsBaseInfoPresent) { // Try to match series from folder and file naming SeriesMatcher seriesMatcher = new SeriesMatcher(); seriesMatcher.MatchSeries(lfsra, episodeInfo); } //Prepare online search improvements if (episodeInfo.SeriesFirstAired == null) { EpisodeInfo tempEpisodeInfo = new EpisodeInfo(); SeriesMatcher seriesMatcher = new SeriesMatcher(); seriesMatcher.MatchSeries(lfsra, tempEpisodeInfo); if (tempEpisodeInfo.SeriesFirstAired.HasValue) { episodeInfo.SeriesFirstAired = tempEpisodeInfo.SeriesFirstAired; } } if (string.IsNullOrEmpty(episodeInfo.SeriesAlternateName)) { var mediaItemPath = lfsra.CanonicalLocalResourcePath; var seriesMediaItemDirectoryPath = ResourcePathHelper.Combine(mediaItemPath, "../../"); episodeInfo.SeriesAlternateName = seriesMediaItemDirectoryPath.FileName; } } if (episodeInfo.Languages.Count == 0) { IList <MultipleMediaItemAspect> audioAspects; if (MediaItemAspect.TryGetAspects(extractedAspectData, VideoAudioStreamAspect.Metadata, out audioAspects)) { foreach (MultipleMediaItemAspect aspect in audioAspects) { string language = (string)aspect.GetAttributeValue(VideoAudioStreamAspect.ATTR_AUDIOLANGUAGE); if (!string.IsNullOrEmpty(language) && !episodeInfo.Languages.Contains(language)) { episodeInfo.Languages.Add(language); } } } } if (SkipOnlineSearches && !SkipFanArtDownload) { EpisodeInfo tempInfo = episodeInfo.Clone(); await OnlineMatcherService.Instance.FindAndUpdateEpisodeAsync(tempInfo).ConfigureAwait(false); episodeInfo.CopyIdsFrom(tempInfo); episodeInfo.HasChanged = tempInfo.HasChanged; } else if (!SkipOnlineSearches) { await OnlineMatcherService.Instance.FindAndUpdateEpisodeAsync(episodeInfo).ConfigureAwait(false); } if (episodeInfo.EpisodeName.IsEmpty) { if (episodeInfo.EpisodeNumbers.Any()) { episodeInfo.EpisodeName = $"E{episodeInfo.EpisodeNumbers.First().ToString("000")}"; } } //Send it to the videos section if (!SkipOnlineSearches && !episodeInfo.HasExternalId) { return(false); } if (episodeInfo.EpisodeNameSort.IsEmpty) { if (!episodeInfo.SeriesName.IsEmpty && episodeInfo.SeasonNumber.HasValue && episodeInfo.DvdEpisodeNumbers.Any()) { episodeInfo.EpisodeNameSort = $"{episodeInfo.SeriesName.Text} S{episodeInfo.SeasonNumber.Value.ToString("00")}E{episodeInfo.DvdEpisodeNumbers.First().ToString("000.000")}"; } if (!episodeInfo.SeriesName.IsEmpty && episodeInfo.SeasonNumber.HasValue && episodeInfo.EpisodeNumbers.Any()) { episodeInfo.EpisodeNameSort = $"{episodeInfo.SeriesName.Text} S{episodeInfo.SeasonNumber.Value.ToString("00")}E{episodeInfo.EpisodeNumbers.First().ToString("000")}"; } else if (!episodeInfo.EpisodeName.IsEmpty) { episodeInfo.EpisodeNameSort = BaseInfo.GetSortTitle(episodeInfo.EpisodeName.Text); } } episodeInfo.SetMetadata(extractedAspectData); return(episodeInfo.IsBaseInfoPresent); }
public override bool SearchSeriesEpisode(EpisodeInfo episodeSearch, TvdbLanguage language, out List <EpisodeInfo> episodes) { language = language ?? PreferredLanguage; episodes = null; SeriesInfo seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>(); if (episodeSearch.SeriesTvdbId <= 0) { if (!SearchSeriesUniqueAndUpdate(seriesSearch, language)) { return(false); } episodeSearch.CopyIdsFrom(seriesSearch); } if (episodeSearch.SeriesTvdbId > 0 && episodeSearch.SeasonNumber.HasValue) { TvdbSeries seriesDetail = _tvdbHandler.GetSeries(episodeSearch.SeriesTvdbId, language, true, false, false); foreach (TvdbEpisode episode in seriesDetail.Episodes.OrderByDescending(e => e.Id)) { if ((episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber) || episodeSearch.EpisodeNumbers.Count == 0) && (episodeSearch.SeasonNumber == episode.SeasonNumber || episodeSearch.SeasonNumber.HasValue == false)) { if (episodes == null) { episodes = new List <EpisodeInfo>(); } EpisodeInfo info = new EpisodeInfo { TvdbId = episode.Id, SeriesName = new SimpleTitle(seriesDetail.SeriesName, false), SeasonNumber = episode.SeasonNumber, EpisodeName = new SimpleTitle(episode.EpisodeName, false), }; info.EpisodeNumbers.Add(episode.EpisodeNumber); info.CopyIdsFrom(seriesSearch); info.Languages.Add(episode.Language.Abbriviation); if (!episodes.Contains(info)) { episodes.Add(info); } } } if (episodes != null) { episodes.Sort(); } } if (episodes == null) { episodes = new List <EpisodeInfo>(); EpisodeInfo info = new EpisodeInfo { SeriesName = seriesSearch.SeriesName, SeasonNumber = episodeSearch.SeasonNumber, EpisodeName = episodeSearch.EpisodeName, }; info.CopyIdsFrom(seriesSearch); CollectionUtils.AddAll(info.EpisodeNumbers, episodeSearch.EpisodeNumbers); info.Languages = seriesSearch.Languages; episodes.Add(info); return(true); } return(episodes != null); }
protected bool ExtractSeriesData(ILocalFsResourceAccessor lfsra, IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData, bool importOnly) { // VideoAspect must be present to be sure it is actually a video resource. if (!extractedAspectData.ContainsKey(VideoStreamAspect.ASPECT_ID) && !extractedAspectData.ContainsKey(SubtitleAspect.ASPECT_ID)) { return(false); } if (extractedAspectData.ContainsKey(SubtitleAspect.ASPECT_ID) && !importOnly) { return(false); //Subtitles can only be imported not refreshed } bool refresh = false; if (extractedAspectData.ContainsKey(EpisodeAspect.ASPECT_ID)) { refresh = true; } EpisodeInfo episodeInfo = new EpisodeInfo(); if (refresh) { episodeInfo.FromMetadata(extractedAspectData); } ISeriesRelationshipExtractor.UpdateEpisodeSeries(extractedAspectData, episodeInfo); if (!episodeInfo.IsBaseInfoPresent) { string title = null; int seasonNumber; SingleMediaItemAspect episodeAspect; MediaItemAspect.TryGetAspect(extractedAspectData, EpisodeAspect.Metadata, out episodeAspect); IEnumerable <int> episodeNumbers; if (MediaItemAspect.TryGetAttribute(extractedAspectData, EpisodeAspect.ATTR_SERIES_NAME, out title) && MediaItemAspect.TryGetAttribute(extractedAspectData, EpisodeAspect.ATTR_SEASON, out seasonNumber) && (episodeNumbers = episodeAspect.GetCollectionAttribute <int>(EpisodeAspect.ATTR_EPISODE)) != null) { episodeInfo.SeriesName = title; episodeInfo.SeasonNumber = seasonNumber; episodeInfo.EpisodeNumbers.Clear(); episodeNumbers.ToList().ForEach(n => episodeInfo.EpisodeNumbers.Add(n)); } } // If there was no complete match, yet, try to get extended information out of matroska files) if (!episodeInfo.IsBaseInfoPresent || !episodeInfo.HasExternalId) { try { MatroskaMatcher matroskaMatcher = new MatroskaMatcher(); if (matroskaMatcher.MatchSeries(lfsra, episodeInfo)) { ServiceRegistration.Get <ILogger>().Debug("ExtractSeriesData: Found EpisodeInfo by MatroskaMatcher for {0}, IMDB {1}, TVDB {2}, TMDB {3}, AreReqiredFieldsFilled {4}", episodeInfo.SeriesName, episodeInfo.SeriesImdbId, episodeInfo.SeriesTvdbId, episodeInfo.SeriesMovieDbId, episodeInfo.IsBaseInfoPresent); } } catch (Exception ex) { ServiceRegistration.Get <ILogger>().Debug("ExtractSeriesData: Exception reading matroska tags for '{0}'", ex, lfsra.CanonicalLocalResourcePath); } } // If no information was found before, try name matching if (!episodeInfo.IsBaseInfoPresent) { // Try to match series from folder and file naming SeriesMatcher seriesMatcher = new SeriesMatcher(); seriesMatcher.MatchSeries(lfsra, episodeInfo); } //Prepare online search improvements if (episodeInfo.SeriesFirstAired == null) { EpisodeInfo tempEpisodeInfo = new EpisodeInfo(); SeriesMatcher seriesMatcher = new SeriesMatcher(); seriesMatcher.MatchSeries(lfsra, tempEpisodeInfo); if (tempEpisodeInfo.SeriesFirstAired.HasValue) { episodeInfo.SeriesFirstAired = tempEpisodeInfo.SeriesFirstAired; } } if (string.IsNullOrEmpty(episodeInfo.SeriesAlternateName)) { var mediaItemPath = lfsra.CanonicalLocalResourcePath; var seriesMediaItemDirectoryPath = ResourcePathHelper.Combine(mediaItemPath, "../../"); episodeInfo.SeriesAlternateName = seriesMediaItemDirectoryPath.FileName; } if (episodeInfo.Languages.Count == 0) { IList <MultipleMediaItemAspect> audioAspects; if (MediaItemAspect.TryGetAspects(extractedAspectData, VideoAudioStreamAspect.Metadata, out audioAspects)) { foreach (MultipleMediaItemAspect aspect in audioAspects) { string language = (string)aspect.GetAttributeValue(VideoAudioStreamAspect.ATTR_AUDIOLANGUAGE); if (!string.IsNullOrEmpty(language) && !episodeInfo.Languages.Contains(language)) { episodeInfo.Languages.Add(language); } } } } episodeInfo.AssignNameId(); if (SkipOnlineSearches && !SkipFanArtDownload) { EpisodeInfo tempInfo = episodeInfo.Clone(); OnlineMatcherService.Instance.FindAndUpdateEpisode(tempInfo, importOnly); episodeInfo.CopyIdsFrom(tempInfo); episodeInfo.HasChanged = tempInfo.HasChanged; } else if (!SkipOnlineSearches) { OnlineMatcherService.Instance.FindAndUpdateEpisode(episodeInfo, importOnly); } //Send it to the videos section if (!SkipOnlineSearches && !episodeInfo.HasExternalId) { return(false); } if (refresh) { if ((IncludeActorDetails && !BaseInfo.HasRelationship(extractedAspectData, PersonAspect.ROLE_ACTOR) && episodeInfo.Actors.Count > 0) || (IncludeCharacterDetails && !BaseInfo.HasRelationship(extractedAspectData, CharacterAspect.ROLE_CHARACTER) && episodeInfo.Characters.Count > 0) || (IncludeDirectorDetails && !BaseInfo.HasRelationship(extractedAspectData, PersonAspect.ROLE_DIRECTOR) && episodeInfo.Directors.Count > 0) || (IncludeWriterDetails && !BaseInfo.HasRelationship(extractedAspectData, PersonAspect.ROLE_WRITER) && episodeInfo.Writers.Count > 0) || (!BaseInfo.HasRelationship(extractedAspectData, SeriesAspect.ROLE_SERIES) && !episodeInfo.SeriesName.IsEmpty) || (!BaseInfo.HasRelationship(extractedAspectData, SeasonAspect.ROLE_SEASON) && episodeInfo.SeasonNumber.HasValue)) { episodeInfo.HasChanged = true; } } if (!episodeInfo.HasChanged && !importOnly) { return(false); } episodeInfo.SetMetadata(extractedAspectData); return(episodeInfo.IsBaseInfoPresent); }