games-screenshot-manager/internal/cli/cli.go

88 lines
2.9 KiB
Go

package cli
import (
"context"
"flag"
"os"
"github.com/fmartingr/games-screenshot-manager/internal/models"
"github.com/fmartingr/games-screenshot-manager/pkg/cache"
"github.com/fmartingr/games-screenshot-manager/pkg/processor"
"github.com/fmartingr/games-screenshot-manager/pkg/providers/minecraft"
"github.com/fmartingr/games-screenshot-manager/pkg/providers/playstation4"
"github.com/fmartingr/games-screenshot-manager/pkg/providers/retroarch"
"github.com/fmartingr/games-screenshot-manager/pkg/providers/steam"
"github.com/fmartingr/games-screenshot-manager/pkg/registry"
"github.com/sirupsen/logrus"
)
const defaultOutputPath string = "./Output"
const defaultInputPath string = ""
const defaultProvider string = "steam"
const defaultDryRun bool = false
const defaultDownloadCovers bool = false
func Start() {
logger := logrus.New()
flagSet := flag.NewFlagSet("gsm", flag.ExitOnError)
cache := cache.NewFileCache(logger)
registry := registry.NewProviderRegistry(logger, cache)
registry.Register(minecraft.Name, minecraft.NewMinecraftProvider)
registry.Register(playstation4.Name, playstation4.NewPlaystation4Provider)
registry.Register(steam.Name, steam.NewSteamProvider)
registry.Register(retroarch.Name, retroarch.NewRetroArchProvider)
options := models.Options{
ProcessBufferSize: 32,
}
flagSet.StringVar(&options.OutputPath, "output-path", defaultOutputPath, "The destination path of the screenshots")
flagSet.BoolVar(&options.DownloadCovers, "download-covers", defaultDownloadCovers, "use to enable the download of covers (if the provider supports it)")
flagSet.BoolVar(&options.DryRun, "dry-run", defaultDryRun, "Use to disable write actions on filesystem")
flagSet.IntVar(&options.WorkersNum, "workers-num", 2, "Number of workers to use to process games")
var providerName = flagSet.String("provider", defaultProvider, "steam")
providerOptions := models.ProviderOptions{}
flagSet.StringVar(&providerOptions.InputPath, "input-path", defaultInputPath, "Input path for the provider that requires it")
loglevelFlag := flagSet.String("log-level", logrus.InfoLevel.String(), "Log level")
if err := flagSet.Parse(os.Args[1:]); err != nil {
logger.Errorf("error parsing args: %s", err)
}
loglevel, err := logrus.ParseLevel(*loglevelFlag)
if err != nil {
logger.Warnf("Invalid loglevel %s, using %s instead.", *loglevelFlag, logrus.InfoLevel.String())
loglevel = logrus.InfoLevel
}
logger.SetLevel(loglevel)
provider, err := registry.Get(*providerName)
if err != nil {
logger.Errorf("Provider %s not found!", *providerName)
return
}
games, err := provider.FindGames(providerOptions)
if err != nil {
logger.Errorf("Error obtaining game list: %s", err)
return
}
if len(games) > 0 {
ctx, cancel := context.WithCancel(context.Background())
processor := processor.NewProcessor(logger, options)
processor.Start(ctx)
for _, g := range games {
processor.Process(g)
}
processor.Wait()
cancel()
}
}