From ab10f0ed8164038ca20b528be94cca10f9013aef Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 7 May 2022 21:24:50 -0500 Subject: [PATCH] add `metadata_kind` to search index (#790) * more nfo cleanup * add metadata_kind to search index --- CHANGELOG.md | 4 ++++ ErsatzTV.Core/Metadata/Nfo/ArtistNfoReader.cs | 4 +--- .../Metadata/Nfo/EpisodeNfoReader.cs | 4 +--- ErsatzTV.Core/Metadata/Nfo/MovieNfoReader.cs | 4 +--- .../Metadata/Nfo/MusicVideoNfoReader.cs | 4 +--- .../Metadata/Nfo/OtherVideoNfoReader.cs | 4 +--- ErsatzTV.Core/Metadata/Nfo/TvShowNfoReader.cs | 4 +--- ErsatzTV.Infrastructure/Search/SearchIndex.cs | 24 ++++++++++++------- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a747077f7..f3097a5f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Reduce memory use due to library scan operations +### Added +- Add `metadata_kind` field to search index to allow searching for items with a particular metdata source + - Valid metadata kinds are `fallback`, `sidecar` (NFO), `external` (from a media server) and `embedded` (songs) + ### Changed - Replace invalid (control) characters in NFO metadata with replacement character `�` before parsing - Store partial (incomplete) NFO metadata results when invalid XML is encountered diff --git a/ErsatzTV.Core/Metadata/Nfo/ArtistNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/ArtistNfoReader.cs index 174da3f56..79ca8e6a4 100644 --- a/ErsatzTV.Core/Metadata/Nfo/ArtistNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/ArtistNfoReader.cs @@ -95,9 +95,7 @@ public class ArtistNfoReader : NfoReader, IArtistNfoReader return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); diff --git a/ErsatzTV.Core/Metadata/Nfo/EpisodeNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/EpisodeNfoReader.cs index 335fb2cf9..6fec90bcc 100644 --- a/ErsatzTV.Core/Metadata/Nfo/EpisodeNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/EpisodeNfoReader.cs @@ -114,9 +114,7 @@ public class EpisodeNfoReader : NfoReader, IEpisodeNfoReader return result; } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return result; diff --git a/ErsatzTV.Core/Metadata/Nfo/MovieNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/MovieNfoReader.cs index 67ae59295..1e039b9c2 100644 --- a/ErsatzTV.Core/Metadata/Nfo/MovieNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/MovieNfoReader.cs @@ -126,9 +126,7 @@ public class MovieNfoReader : NfoReader, IMovieNfoReader return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); diff --git a/ErsatzTV.Core/Metadata/Nfo/MusicVideoNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/MusicVideoNfoReader.cs index bb09b3acc..d057be1ce 100644 --- a/ErsatzTV.Core/Metadata/Nfo/MusicVideoNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/MusicVideoNfoReader.cs @@ -108,9 +108,7 @@ public class MusicVideoNfoReader : NfoReader, IMusicVideoNfoReade return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); diff --git a/ErsatzTV.Core/Metadata/Nfo/OtherVideoNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/OtherVideoNfoReader.cs index d1668b183..ad69876f8 100644 --- a/ErsatzTV.Core/Metadata/Nfo/OtherVideoNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/OtherVideoNfoReader.cs @@ -126,9 +126,7 @@ public class OtherVideoNfoReader : NfoReader, IOtherVideoNfoReade return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); diff --git a/ErsatzTV.Core/Metadata/Nfo/TvShowNfoReader.cs b/ErsatzTV.Core/Metadata/Nfo/TvShowNfoReader.cs index bc05b0f60..5a18cb9c7 100644 --- a/ErsatzTV.Core/Metadata/Nfo/TvShowNfoReader.cs +++ b/ErsatzTV.Core/Metadata/Nfo/TvShowNfoReader.cs @@ -112,9 +112,7 @@ public class TvShowNfoReader : NfoReader, ITvShowNfoReader return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); } - catch (XmlException ex) when (ex.Message.Contains( - "invalid character", - StringComparison.InvariantCultureIgnoreCase)) + catch (XmlException) { _logger.LogWarning("Invalid XML detected; returning incomplete metadata"); return Optional(nfo).ToEither((BaseError)new FailedToReadNfo()); diff --git a/ErsatzTV.Infrastructure/Search/SearchIndex.cs b/ErsatzTV.Infrastructure/Search/SearchIndex.cs index 17237e915..618d92b2d 100644 --- a/ErsatzTV.Infrastructure/Search/SearchIndex.cs +++ b/ErsatzTV.Infrastructure/Search/SearchIndex.cs @@ -54,6 +54,7 @@ public sealed class SearchIndex : ISearchIndex private const string ShowTitleField = "show_title"; private const string ShowGenreField = "show_genre"; private const string ShowTagField = "show_tag"; + private const string MetadataKindField = "metadata_kind"; internal const string MinutesField = "minutes"; internal const string HeightField = "height"; @@ -87,7 +88,7 @@ public sealed class SearchIndex : ISearchIndex _initialized = false; } - public int Version => 24; + public int Version => 25; public async Task Initialize( ILocalFileSystem localFileSystem, @@ -363,7 +364,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(LibraryIdField, movie.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), - new StringField(StateField, movie.State.ToString(), Field.Store.NO) + new StringField(StateField, movie.State.ToString(), Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; await AddLanguages(searchRepository, doc, movie.MediaVersions); @@ -500,7 +502,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(LibraryIdField, show.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), - new StringField(StateField, show.State.ToString(), Field.Store.NO) + new StringField(StateField, show.State.ToString(), Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; List languages = await searchRepository.GetLanguagesForShow(show); @@ -670,7 +673,8 @@ public sealed class SearchIndex : ISearchIndex new TextField(LibraryNameField, artist.LibraryPath.Library.Name, Field.Store.NO), new StringField(LibraryIdField, artist.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), - new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) + new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; List languages = await searchRepository.GetLanguagesForArtist(artist); @@ -722,7 +726,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(LibraryIdField, musicVideo.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), - new StringField(StateField, musicVideo.State.ToString(), Field.Store.NO) + new StringField(StateField, musicVideo.State.ToString(), Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; await AddLanguages(searchRepository, doc, musicVideo.MediaVersions); @@ -818,7 +823,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), new StringField(StateField, episode.State.ToString(), Field.Store.NO), new Int32Field(SeasonNumberField, episode.Season?.SeasonNumber ?? 0, Field.Store.NO), - new Int32Field(EpisodeNumberField, metadata.EpisodeNumber, Field.Store.NO) + new Int32Field(EpisodeNumberField, metadata.EpisodeNumber, Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; // add some show fields to help filter episodes within a particular show @@ -938,7 +944,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(LibraryIdField, otherVideo.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), - new StringField(StateField, otherVideo.State.ToString(), Field.Store.NO) + new StringField(StateField, otherVideo.State.ToString(), Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; await AddLanguages(searchRepository, doc, otherVideo.MediaVersions); @@ -1036,7 +1043,8 @@ public sealed class SearchIndex : ISearchIndex new StringField(LibraryIdField, song.LibraryPath.Library.Id.ToString(), Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES), - new StringField(StateField, song.State.ToString(), Field.Store.NO) + new StringField(StateField, song.State.ToString(), Field.Store.NO), + new TextField(MetadataKindField, metadata.MetadataKind.ToString(), Field.Store.NO) }; await AddLanguages(searchRepository, doc, song.MediaVersions);