2019-11-19 02:49:05 +00:00
|
|
|
package scraper
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
"github.com/stashapp/stash/pkg/logger"
|
|
|
|
"github.com/stashapp/stash/pkg/manager/config"
|
|
|
|
"github.com/stashapp/stash/pkg/models"
|
|
|
|
)
|
|
|
|
|
|
|
|
var scrapers []scraperConfig
|
|
|
|
|
|
|
|
func loadScrapers() ([]scraperConfig, error) {
|
|
|
|
if scrapers != nil {
|
|
|
|
return scrapers, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
path := config.GetScrapersPath()
|
|
|
|
scrapers = make([]scraperConfig, 0)
|
|
|
|
|
|
|
|
logger.Debugf("Reading scraper configs from %s", path)
|
2019-12-12 19:27:44 +00:00
|
|
|
scraperFiles, err := filepath.Glob(filepath.Join(path, "*.yml"))
|
2019-11-19 02:49:05 +00:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
logger.Errorf("Error reading scraper configs: %s", err.Error())
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// add built-in freeones scraper
|
|
|
|
scrapers = append(scrapers, GetFreeonesScraper())
|
|
|
|
|
|
|
|
for _, file := range scraperFiles {
|
2019-12-12 19:27:44 +00:00
|
|
|
scraper, err := loadScraperFromYAML(file)
|
2019-11-19 02:49:05 +00:00
|
|
|
if err != nil {
|
|
|
|
logger.Errorf("Error loading scraper %s: %s", file, err.Error())
|
|
|
|
} else {
|
|
|
|
scrapers = append(scrapers, *scraper)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return scrapers, nil
|
|
|
|
}
|
|
|
|
|
2019-12-12 19:27:44 +00:00
|
|
|
func ListPerformerScrapers() ([]*models.Scraper, error) {
|
2019-11-19 02:49:05 +00:00
|
|
|
// read scraper config files from the directory and cache
|
|
|
|
scrapers, err := loadScrapers()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var ret []*models.Scraper
|
|
|
|
for _, s := range scrapers {
|
|
|
|
// filter on type
|
2019-12-12 19:27:44 +00:00
|
|
|
if s.supportsPerformers() {
|
2019-11-19 02:49:05 +00:00
|
|
|
ret = append(ret, s.toScraper())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func findPerformerScraper(scraperID string) *scraperConfig {
|
|
|
|
// read scraper config files from the directory and cache
|
|
|
|
loadScrapers()
|
|
|
|
|
|
|
|
for _, s := range scrapers {
|
|
|
|
if s.ID == scraperID {
|
|
|
|
return &s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func ScrapePerformerList(scraperID string, query string) ([]*models.ScrapedPerformer, error) {
|
|
|
|
// find scraper with the provided id
|
|
|
|
s := findPerformerScraper(scraperID)
|
|
|
|
if s != nil {
|
|
|
|
return s.ScrapePerformerNames(query)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, errors.New("Scraper with ID " + scraperID + " not found")
|
|
|
|
}
|
|
|
|
|
|
|
|
func ScrapePerformer(scraperID string, scrapedPerformer models.ScrapedPerformerInput) (*models.ScrapedPerformer, error) {
|
|
|
|
// find scraper with the provided id
|
|
|
|
s := findPerformerScraper(scraperID)
|
|
|
|
if s != nil {
|
|
|
|
return s.ScrapePerformer(scrapedPerformer)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, errors.New("Scraper with ID " + scraperID + " not found")
|
|
|
|
}
|
|
|
|
|
|
|
|
func ScrapePerformerURL(url string) (*models.ScrapedPerformer, error) {
|
2019-12-12 19:27:44 +00:00
|
|
|
for _, s := range scrapers {
|
|
|
|
if s.matchesPerformerURL(url) {
|
|
|
|
return s.ScrapePerformerURL(url)
|
|
|
|
}
|
2019-11-19 02:49:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil, nil
|
|
|
|
}
|