From 62d7076ff39e8d95e4549f0dee5314fab777d264 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Wed, 16 Apr 2025 08:55:27 +1000 Subject: [PATCH] Add missing group scraper fields (#5820) --- internal/api/resolver_query_scraper.go | 4 +-- internal/api/scraped_content.go | 35 +++++++++++++++++++++++- pkg/scraper/config.go | 5 ++++ pkg/scraper/mapped.go | 38 ++++++++++++++++---------- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/internal/api/resolver_query_scraper.go b/internal/api/resolver_query_scraper.go index cbede59a7..f0e89cd34 100644 --- a/internal/api/resolver_query_scraper.go +++ b/internal/api/resolver_query_scraper.go @@ -101,12 +101,12 @@ func (r *queryResolver) ScrapeMovieURL(ctx context.Context, url string) (*models } func (r *queryResolver) ScrapeGroupURL(ctx context.Context, url string) (*models.ScrapedGroup, error) { - content, err := r.scraperCache().ScrapeURL(ctx, url, scraper.ScrapeContentTypeMovie) + content, err := r.scraperCache().ScrapeURL(ctx, url, scraper.ScrapeContentTypeGroup) if err != nil { return nil, err } - ret, err := marshalScrapedMovie(content) + ret, err := marshalScrapedGroup(content) if err != nil { return nil, err } diff --git a/internal/api/scraped_content.go b/internal/api/scraped_content.go index de461ada7..6288812ef 100644 --- a/internal/api/scraped_content.go +++ b/internal/api/scraped_content.go @@ -113,7 +113,30 @@ func marshalScrapedMovies(content []scraper.ScrapedContent) ([]*models.ScrapedMo case models.ScrapedMovie: ret = append(ret, &m) default: - return nil, fmt.Errorf("%w: cannot turn ScrapedConetnt into ScrapedMovie", models.ErrConversion) + return nil, fmt.Errorf("%w: cannot turn ScrapedContent into ScrapedMovie", models.ErrConversion) + } + } + + return ret, nil +} + +// marshalScrapedMovies converts ScrapedContent into ScrapedMovie. If conversion +// fails, an error is returned. +func marshalScrapedGroups(content []scraper.ScrapedContent) ([]*models.ScrapedGroup, error) { + var ret []*models.ScrapedGroup + for _, c := range content { + if c == nil { + // graphql schema requires groups to be non-nil + continue + } + + switch m := c.(type) { + case *models.ScrapedGroup: + ret = append(ret, m) + case models.ScrapedGroup: + ret = append(ret, &m) + default: + return nil, fmt.Errorf("%w: cannot turn ScrapedContent into ScrapedGroup", models.ErrConversion) } } @@ -169,3 +192,13 @@ func marshalScrapedMovie(content scraper.ScrapedContent) (*models.ScrapedMovie, return m[0], nil } + +// marshalScrapedMovie will marshal a single scraped movie +func marshalScrapedGroup(content scraper.ScrapedContent) (*models.ScrapedGroup, error) { + m, err := marshalScrapedGroups([]scraper.ScrapedContent{content}) + if err != nil { + return nil, err + } + + return m[0], nil +} diff --git a/pkg/scraper/config.go b/pkg/scraper/config.go index 5078af30b..5775dc97c 100644 --- a/pkg/scraper/config.go +++ b/pkg/scraper/config.go @@ -378,6 +378,11 @@ func (c config) matchesURL(url string, ty ScrapeContentType) bool { } } case ScrapeContentTypeMovie, ScrapeContentTypeGroup: + for _, scraper := range c.GroupByURL { + if scraper.matchesURL(url) { + return true + } + } for _, scraper := range c.MovieByURL { if scraper.matchesURL(url) { return true diff --git a/pkg/scraper/mapped.go b/pkg/scraper/mapped.go index 8ac2874f1..4b2559334 100644 --- a/pkg/scraper/mapped.go +++ b/pkg/scraper/mapped.go @@ -851,7 +851,10 @@ type mappedScraper struct { Gallery *mappedGalleryScraperConfig `yaml:"gallery"` Image *mappedImageScraperConfig `yaml:"image"` Performer *mappedPerformerScraperConfig `yaml:"performer"` - Movie *mappedMovieScraperConfig `yaml:"movie"` + Group *mappedMovieScraperConfig `yaml:"group"` + + // deprecated + Movie *mappedMovieScraperConfig `yaml:"movie"` } type mappedResult map[string]interface{} @@ -1247,24 +1250,29 @@ func (s mappedScraper) scrapeGallery(ctx context.Context, q mappedQuery) (*model return &ret, nil } -func (s mappedScraper) scrapeGroup(ctx context.Context, q mappedQuery) (*models.ScrapedMovie, error) { - var ret models.ScrapedMovie +func (s mappedScraper) scrapeGroup(ctx context.Context, q mappedQuery) (*models.ScrapedGroup, error) { + var ret models.ScrapedGroup - movieScraperConfig := s.Movie - if movieScraperConfig == nil { + // try group scraper first, falling back to movie + groupScraperConfig := s.Group + + if groupScraperConfig == nil { + groupScraperConfig = s.Movie + } + if groupScraperConfig == nil { return nil, nil } - movieMap := movieScraperConfig.mappedConfig + groupMap := groupScraperConfig.mappedConfig - movieStudioMap := movieScraperConfig.Studio - movieTagsMap := movieScraperConfig.Tags + groupStudioMap := groupScraperConfig.Studio + groupTagsMap := groupScraperConfig.Tags - results := movieMap.process(ctx, q, s.Common, urlsIsMulti) + results := groupMap.process(ctx, q, s.Common, urlsIsMulti) - if movieStudioMap != nil { - logger.Debug(`Processing movie studio:`) - studioResults := movieStudioMap.process(ctx, q, s.Common, nil) + if groupStudioMap != nil { + logger.Debug(`Processing group studio:`) + studioResults := groupStudioMap.process(ctx, q, s.Common, nil) if len(studioResults) > 0 { studio := &models.ScrapedStudio{} @@ -1274,9 +1282,9 @@ func (s mappedScraper) scrapeGroup(ctx context.Context, q mappedQuery) (*models. } // now apply the tags - if movieTagsMap != nil { - logger.Debug(`Processing movie tags:`) - tagResults := movieTagsMap.process(ctx, q, s.Common, nil) + if groupTagsMap != nil { + logger.Debug(`Processing group tags:`) + tagResults := groupTagsMap.process(ctx, q, s.Common, nil) for _, p := range tagResults { tag := &models.ScrapedTag{}