package xbox_game_bar import ( "fmt" "io/ioutil" "path/filepath" "strings" "github.com/fmartingr/games-screenshot-manager/internal/exif" "github.com/fmartingr/games-screenshot-manager/internal/models" "github.com/fmartingr/games-screenshot-manager/pkg/helpers" "github.com/gosimple/slug" "github.com/sirupsen/logrus" ) const Name = "xbox-game-bar" const platformName = "PC" type XboxGameBarProvider struct { logger *logrus.Entry } func (p *XboxGameBarProvider) FindGames(options models.ProviderOptions) ([]*models.Game, error) { var userGames []*models.Game path := helpers.ExpandUser(options.InputPath) files, err := ioutil.ReadDir(path) if err != nil { return nil, fmt.Errorf("error reading from path %s: %s", options.InputPath, err) } games := make(map[string]*models.Game) for _, file := range files { fullPath := filepath.Join(path, file.Name()) if strings.Contains(file.Name(), ".png") || strings.Contains(file.Name(), ".mp4") { tags, err := exif.GetTags(fullPath) if err != nil { p.logger.Errorf("err: %s", err) continue } titleTag := "MicrosoftGameDVRTitle" if strings.Contains(file.Name(), ".mp4") { titleTag = "Title" } gameName := tags[titleTag] game, exists := games[tags[titleTag]] if !exists { game = &models.Game{ ID: slug.Make(gameName), Name: gameName, Platform: platformName, Provider: Name, } games[tags[titleTag]] = game } game.Screenshots = append(game.Screenshots, models.NewScreenshotWithoutDestination(path+"/"+file.Name())) } } for _, g := range games { userGames = append(userGames, g) } return userGames, nil } func NewXboxGameGarProvider(logger *logrus.Logger, cache models.Cache) models.Provider { return &XboxGameBarProvider{ logger: logger.WithField("from", "provider."+Name), } }