From d0f009f127d51671e779879dc0b2e67e4219ae54 Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Thu, 4 Dec 2025 12:47:46 -0500 Subject: [PATCH] Quick import now runs TPDB bulk with AE enrichment and per-page import CTAs --- internal/import/enrich.go | 60 +++++++++++++++++++++++++++ internal/import/service.go | 18 ++++++-- internal/web/server.go | 3 ++ internal/web/templates/dashboard.html | 4 +- 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 internal/import/enrich.go diff --git a/internal/import/enrich.go b/internal/import/enrich.go new file mode 100644 index 0000000..fcb716d --- /dev/null +++ b/internal/import/enrich.go @@ -0,0 +1,60 @@ +package import_service + +import ( + "context" + "log" + "strings" + "time" + + "git.leaktechnologies.dev/stu/Goondex/internal/db" + "git.leaktechnologies.dev/stu/Goondex/internal/model" + "git.leaktechnologies.dev/stu/Goondex/internal/scraper/adultemp" +) + +type Enricher struct { + db *db.DB + adult *adultemp.Scraper + delay time.Duration + enabled bool +} + +func NewEnricher(database *db.DB, delay time.Duration) (*Enricher, error) { + adult, err := adultemp.NewScraper() + if err != nil { + return nil, err + } + return &Enricher{ + db: database, + adult: adult, + delay: delay, + enabled: true, + }, nil +} + +// EnrichPerformer tries to fill missing fields via Adult Empire by name search. +func (e *Enricher) EnrichPerformer(ctx context.Context, p *model.Performer) { + if !e.enabled || p == nil { + return + } + name := strings.TrimSpace(p.Name) + if name == "" { + return + } + results, err := e.adult.SearchPerformersByName(ctx, name) + if err != nil || len(results) == 0 { + return + } + data, err := e.adult.ScrapePerformerByURL(ctx, results[0].URL) + if err != nil { + return + } + merged := e.adult.ConvertPerformerToModel(data) + merged.ID = p.ID + store := db.NewPerformerStore(e.db) + if err := store.Create(merged); err != nil { + log.Printf("enrich: failed to update performer %s: %v", name, err) + } + if e.delay > 0 { + time.Sleep(e.delay) + } +} diff --git a/internal/import/service.go b/internal/import/service.go index 84154dd..f5dabaa 100644 --- a/internal/import/service.go +++ b/internal/import/service.go @@ -24,18 +24,25 @@ type ProgressCallback func(update ProgressUpdate) // Service handles bulk import operations type Service struct { - db *db.DB - scraper *tpdb.Scraper + db *db.DB + scraper *tpdb.Scraper + enricher *Enricher } // NewService creates a new import service func NewService(database *db.DB, scraper *tpdb.Scraper) *Service { return &Service{ - db: database, - scraper: scraper, + db: database, + scraper: scraper, + enricher: nil, } } +// WithEnricher configures enrichment (optional). +func (s *Service) WithEnricher(enricher *Enricher) { + s.enricher = enricher +} + // ImportResult contains the results of an import operation type ImportResult struct { EntityType string @@ -76,6 +83,9 @@ func (s *Service) BulkImportAllPerformersWithProgress(ctx context.Context, progr result.Failed++ } else { result.Imported++ + if s.enricher != nil { + s.enricher.EnrichPerformer(ctx, &performer) + } } // Send progress update diff --git a/internal/web/server.go b/internal/web/server.go index a3b7240..a962488 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -1120,6 +1120,9 @@ func (s *Server) handleAPIBulkImportPerformers(w http.ResponseWriter, r *http.Re scraper := tpdb.NewScraper("https://api.theporndb.net", apiKey) service := import_service.NewService(s.db, scraper) + if enricher, err := import_service.NewEnricher(s.db, 1*time.Second); err == nil { + service.WithEnricher(enricher) + } result, err := service.BulkImportAllPerformers(context.Background()) if err != nil { diff --git a/internal/web/templates/dashboard.html b/internal/web/templates/dashboard.html index a663312..86c3ea6 100644 --- a/internal/web/templates/dashboard.html +++ b/internal/web/templates/dashboard.html @@ -126,8 +126,8 @@
View all → -