Quick import now runs TPDB bulk with AE enrichment and per-page import CTAs

This commit is contained in:
Stu Leak 2025-12-04 12:47:46 -05:00
parent 4f14d3b032
commit d0f009f127
4 changed files with 79 additions and 6 deletions

60
internal/import/enrich.go Normal file
View File

@ -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)
}
}

View File

@ -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

View File

@ -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 {

View File

@ -126,8 +126,8 @@
</div>
<div class="stat-actions">
<a href="/performers" class="stat-link">View all →</a>
<button class="btn-small" onclick="aeImportPerformerByName()">
Quick import
<button class="btn-small" onclick="bulkImportPerformers()">
Import all
<div class="hoverEffect"><div></div></div>
</button>
</div>