games-screenshot-manager/pkg/providers/nintendo_switch/switch.go

112 lines
2.9 KiB
Go

package nintendo_switch
import (
"encoding/json"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"time"
"github.com/fmartingr/games-screenshot-mananger/pkg/games"
"github.com/fmartingr/games-screenshot-mananger/pkg/helpers"
)
const providerName = "nintendo-switch"
const gameListURL = "https://fmartingr.github.io/switch-games-json/switch_games.json"
type SwitchGame struct {
Name string `json:"description"`
EncryptedGameID string `json:"encrypted_game_id"`
}
func findGameByEncryptedID(gameList []SwitchGame, encryptedGameID string) SwitchGame {
var gameFound SwitchGame = SwitchGame{EncryptedGameID: encryptedGameID}
for _, game := range gameList {
if strings.ToUpper(game.EncryptedGameID) == strings.ToUpper(encryptedGameID) {
gameFound = game
}
}
return gameFound
}
func getSwitchGameList() []SwitchGame {
response, err := helpers.DoRequest("GET", gameListURL)
if err != nil {
log.Panic(err)
}
if response.Body != nil {
defer response.Body.Close()
}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Panic(err)
}
switchGameList := []SwitchGame{}
jsonErr := json.Unmarshal(body, &switchGameList)
if jsonErr != nil {
log.Fatal(jsonErr)
}
log.Printf("Updated Nintendo Switch game list. Found %d games.", len(switchGameList))
return switchGameList
}
func addScreenshotToGame(userGames []games.Game, switchGame SwitchGame, screenshot games.Screenshot) []games.Game {
var foundGame games.Game
for gameIndex, game := range userGames {
if game.ID == switchGame.EncryptedGameID {
foundGame = game
userGames[gameIndex].Screenshots = append(userGames[gameIndex].Screenshots, screenshot)
}
}
if foundGame.ID == "" {
foundGame := games.Game{Name: switchGame.Name, ID: switchGame.EncryptedGameID, Platform: "Nintendo Switch", Provider: providerName}
foundGame.Screenshots = append(foundGame.Screenshots, screenshot)
userGames = append(userGames, foundGame)
}
return userGames
}
func GetGames(inputPath string) []games.Game {
switchGames := getSwitchGameList()
var userGames []games.Game
err := filepath.Walk(inputPath,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
filename := filepath.Base(path)
extension := filepath.Ext(filepath.Base(path))
filenameParsed := strings.Split(filename[:len(filename)-len(extension)], "-")
switchGame := findGameByEncryptedID(switchGames, filenameParsed[1])
layout := "20060102150405"
destinationName, err := time.Parse(layout, filenameParsed[0][0:14])
if err != nil {
log.Panic("Could not parse filename: ", err)
}
screenshot := games.Screenshot{Path: path, DestinationName: destinationName.Format(games.DatetimeFormat) + extension}
userGames = addScreenshotToGame(userGames, switchGame, screenshot)
}
return nil
})
if err != nil {
log.Panic(err)
}
return userGames
}