From eb8f83e1b94919e5c2580e4254373fdcb0a60c9b Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 8 Feb 2026 11:05:29 -0500 Subject: [PATCH] feat: update ebook scanner to normalize metadata Update extractEPUBMetadata: - Normalize tags for display using NormalizeTags() - Normalize contributors for display using NormalizeContributors() - Preserves extracted metadata formatting while ensuring consistency Update processEbookFile: - Add normalization before database insert - Generate tags_search using NormalizeTagsSearch() - Generate contributors_search using NormalizeContributorsSearch() - Pass both display and search fields to CreateMediaItem Scanner now produces normalized metadata matching user input normalization, ensuring consistency between scanned and manually entered media items. Relates to Tags & Contributors Migration Phase 7 --- internal/services/ebook_scanner.go | 52 ++++++++++++++++++------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/internal/services/ebook_scanner.go b/internal/services/ebook_scanner.go index f3165b5..9197220 100644 --- a/internal/services/ebook_scanner.go +++ b/internal/services/ebook_scanner.go @@ -452,25 +452,35 @@ func (s *EbookScanner) processEbookFile(ctx context.Context, path string) error return fmt.Errorf("no library found for file path: %s", path) } + // Normalize metadata fields for display + metadata.Contributors = utils.NormalizeContributors(metadata.Contributors) + metadata.Tags = utils.NormalizeTags(metadata.Tags) + + // Normalize search fields + contributorsSearch := utils.NormalizeContributorsSearch(metadata.Contributors) + tagsSearch := utils.NormalizeTagsSearch(metadata.Tags) + // Create media item in database createdItem, err := s.db.CreateMediaItem(ctx, database.CreateMediaItemParams{ - LibraryID: libraryID, - Title: metadata.Title, - Author: pgtype.Text{String: metadata.Author, Valid: metadata.Author != ""}, - Isbn: pgtype.Text{String: utils.NormalizeISBN(metadata.ISBN), Valid: metadata.ISBN != ""}, - Asin: pgtype.Text{String: metadata.ASIN, Valid: metadata.ASIN != ""}, - Description: pgtype.Text{String: metadata.Description, Valid: metadata.Description != ""}, - FilePath: path, - FileSize: pgtype.Int8{Int64: info.Size(), Valid: true}, - MimeType: pgtype.Text{String: s.getMimeType(path), Valid: true}, - CoverImagePath: pgtype.Text{String: metadata.CoverPath, Valid: metadata.CoverPath != ""}, - Series: pgtype.Text{String: metadata.Series, Valid: metadata.Series != ""}, - SeriesNumber: pgtype.Int4{Int32: metadata.SeriesNumber, Valid: metadata.SeriesNumber > 0}, - Publisher: pgtype.Text{String: metadata.Publisher, Valid: metadata.Publisher != ""}, - DatePublished: pgtype.Date{Time: metadata.PublishDate, Valid: !metadata.PublishDate.IsZero()}, - Contributors: metadata.Contributors, - Tags: metadata.Tags, - AddedByAdminID: s.adminID, + LibraryID: libraryID, + Title: metadata.Title, + Author: pgtype.Text{String: metadata.Author, Valid: metadata.Author != ""}, + Isbn: pgtype.Text{String: utils.NormalizeISBN(metadata.ISBN), Valid: metadata.ISBN != ""}, + Asin: pgtype.Text{String: metadata.ASIN, Valid: metadata.ASIN != ""}, + Description: pgtype.Text{String: metadata.Description, Valid: metadata.Description != ""}, + FilePath: path, + FileSize: pgtype.Int8{Int64: info.Size(), Valid: true}, + MimeType: pgtype.Text{String: s.getMimeType(path), Valid: true}, + CoverImagePath: pgtype.Text{String: metadata.CoverPath, Valid: metadata.CoverPath != ""}, + Series: pgtype.Text{String: metadata.Series, Valid: metadata.Series != ""}, + SeriesNumber: pgtype.Int4{Int32: metadata.SeriesNumber, Valid: metadata.SeriesNumber > 0}, + Publisher: pgtype.Text{String: metadata.Publisher, Valid: metadata.Publisher != ""}, + DatePublished: pgtype.Date{Time: metadata.PublishDate, Valid: !metadata.PublishDate.IsZero()}, + Contributors: metadata.Contributors, + ContributorsSearch: contributorsSearch, + Tags: metadata.Tags, + TagsSearch: tagsSearch, + AddedByAdminID: s.adminID, }) if err != nil { return fmt.Errorf("failed to create media item: %v", err) @@ -576,8 +586,8 @@ func (s *EbookScanner) extractEPUBMetadata(path string) (*EbookMetadata, error) // Contributors if contributors, err := book.MetadataByKey("contributor"); err == nil && len(contributors) > 0 { - // Already a []string from xml parsing, just assign - metadata.Contributors = contributors + // Normalize contributors for display + metadata.Contributors = utils.NormalizeContributors(contributors) } // ISBN @@ -603,8 +613,8 @@ func (s *EbookScanner) extractEPUBMetadata(path string) (*EbookMetadata, error) // Tags if tags, err := book.MetadataByKey("subject"); err == nil && len(tags) > 0 { - // Already a []string from xml parsing, just assign - metadata.Tags = tags + // Normalize tags for display + metadata.Tags = utils.NormalizeTags(tags) } return metadata, nil