Exemple #1
0
        public async Task <ExpandedGame> GetExpandedGame(ulong gameId)
        {
            var game = await igdbApi.Games.Get(gameId);

            if (game.id == 0)
            {
                new ExpandedGame();
            }

            var parsedGame = new ExpandedGame()
            {
                id                 = game.id,
                name               = game.name,
                slug               = game.slug,
                url                = game.url,
                summary            = game.summary,
                storyline          = game.storyline,
                popularity         = game.popularity,
                version_title      = game.version_title,
                category           = game.category,
                first_release_date = game.first_release_date * 1000,
                rating             = game.rating,
                aggregated_rating  = game.aggregated_rating,
                total_rating       = game.total_rating
            };

            parsedGame.alternative_names = await igdbApi.AlternativeNames.Get(game.alternative_names);

            parsedGame.involved_companies = await igdbApi.InvolvedCompanies.GetExpanded(game.involved_companies);

            parsedGame.genres = await igdbApi.Genres.Get(game.genres);

            parsedGame.websites = await igdbApi.Websites.Get(game.websites);

            parsedGame.game_modes = await igdbApi.GameModes.Get(game.game_modes);

            parsedGame.player_perspectives = await igdbApi.PlayerPerspectives.Get(game.player_perspectives);

            parsedGame.cover = await igdbApi.Covers.Get(game.cover);

            parsedGame.artworks = await igdbApi.Artworks.Get(game.artworks);

            parsedGame.screenshots = await igdbApi.Screenshots.Get(game.screenshots);

            parsedGame.age_ratings = await igdbApi.AgeRatings.Get(game.age_ratings);

            parsedGame.collection = await igdbApi.Collections.Get(game.collection);

            return(parsedGame);
        }
Exemple #2
0
        public async Task <ServicesResponse <List <ExpandedGame> > > Get(string gameName)
        {
            List <Game> searchResult = null;

            gameName = gameName.ToLower().Trim();
            gameName = Regex.Replace(gameName, @"\s+", " ");
            var cachePath = Path.Combine(IGDB.CacheDirectory, cacheDir, Playnite.Common.Paths.GetSafeFilename(gameName) + ".json");

            lock (CacheLock)
            {
                if (System.IO.File.Exists(cachePath))
                {
                    var fileInfo = new FileInfo(cachePath);
                    fileInfo.Refresh();
                    if ((DateTime.Now - fileInfo.LastWriteTime).TotalHours <= IGDB.SearchCacheTimeout)
                    {
                        searchResult = JsonConvert.DeserializeObject <List <Game> >(System.IO.File.ReadAllText(cachePath));
                    }
                }
            }

            if (searchResult == null)
            {
                var libraryStringResult = await IGDB.SendStringRequest("games", $"search \"{HttpUtility.UrlDecode(gameName)}\"; fields id; limit 40;");

                searchResult = JsonConvert.DeserializeObject <List <Game> >(libraryStringResult);
                lock (CacheLock)
                {
                    Playnite.Common.FileSystem.PrepareSaveFile(cachePath);
                    System.IO.File.WriteAllText(cachePath, libraryStringResult);
                }
            }

            var finalResult = new List <ExpandedGame>();

            using (var gameController = new GameController(appSettings))
            {
                for (int i = 0; i < searchResult.Count; i++)
                {
                    Game result = null;
                    try
                    {
                        result = (await gameController.Get(searchResult[i].id)).Data;
                    }
                    catch (Exception e)
                    {
                        logger.Error(e, $"Failed to get game {searchResult[i].id}");
                        continue;
                    }

                    if (result.id == 0)
                    {
                        continue;
                    }

                    var xpanded = new ExpandedGame()
                    {
                        id   = result.id,
                        name = result.name,
                        first_release_date = result.first_release_date * 1000
                    };

                    if (result.alternative_names?.Any() == true)
                    {
                        xpanded.alternative_names = new List <AlternativeName>();
                        foreach (var nameId in result.alternative_names)
                        {
                            xpanded.alternative_names.Add((await AlternativeNameController.GetItem(nameId)).Data);
                        }
                    }

                    finalResult.Add(xpanded);
                }
            }

            return(new ServicesResponse <List <ExpandedGame> >(finalResult));
        }
Exemple #3
0
        public async static Task <ExpandedGame> GetExpandedGame(ulong gameId)
        {
            var game = (await GameController.GetItem(gameId)).Data;

            if (game.id == 0)
            {
                new ExpandedGame();
            }

            var parsedGame = new ExpandedGame()
            {
                id                 = game.id,
                name               = game.name,
                slug               = game.slug,
                url                = game.url,
                summary            = game.summary,
                storyline          = game.storyline,
                popularity         = game.popularity,
                version_title      = game.version_title,
                category           = game.category,
                first_release_date = game.first_release_date * 1000,
                rating             = game.rating,
                aggregated_rating  = game.aggregated_rating,
                total_rating       = game.total_rating
            };

            if (game.alternative_names?.Any() == true)
            {
                parsedGame.alternative_names = new List <AlternativeName>();
                foreach (var nameId in game.alternative_names)
                {
                    parsedGame.alternative_names.Add((await AlternativeNameController.GetItem(nameId)).Data);
                }
            }

            if (game.involved_companies?.Any() == true)
            {
                parsedGame.involved_companies = new List <ExpandedInvolvedCompany>();
                foreach (var companyId in game.involved_companies)
                {
                    parsedGame.involved_companies.Add((await InvolvedCompanyController.GetItem(companyId)).Data);
                }
            }

            if (game.genres?.Any() == true)
            {
                parsedGame.genres_v3 = new List <Genre>();
                foreach (var genreId in game.genres)
                {
                    parsedGame.genres_v3.Add((await GenreController.GetItem(genreId)).Data);
                }
            }

            if (game.websites?.Any() == true)
            {
                parsedGame.websites = new List <Website>();
                foreach (var websiteId in game.websites)
                {
                    parsedGame.websites.Add((await WebsiteController.GetItem(websiteId)).Data);
                }
            }

            if (game.game_modes?.Any() == true)
            {
                parsedGame.game_modes_v3 = new List <GameMode>();
                foreach (var modeId in game.game_modes)
                {
                    parsedGame.game_modes_v3.Add((await GameModeController.GetItem(modeId)).Data);
                }
            }

            if (game.player_perspectives?.Any() == true)
            {
                parsedGame.player_perspectives = new List <PlayerPerspective>();
                foreach (var persId in game.player_perspectives)
                {
                    parsedGame.player_perspectives.Add((await PlayerPerspectiveController.GetItem(persId)).Data);
                }
            }

            if (game.cover > 0)
            {
                parsedGame.cover_v3 = (await CoverController.GetItem(game.cover)).Data;
            }

            if (game.artworks?.Any() == true)
            {
                parsedGame.artworks = new List <GameImage>();
                foreach (var artworkId in game.artworks)
                {
                    parsedGame.artworks.Add((await ArtworkController.GetItem(artworkId)).Data);
                }
            }

            if (game.screenshots?.Any() == true)
            {
                parsedGame.screenshots = new List <GameImage>();
                foreach (var screenshotId in game.screenshots)
                {
                    parsedGame.screenshots.Add((await ScreenshotController.GetItem(screenshotId)).Data);
                }
            }

            // fallback properties for 4.x
            parsedGame.cover      = parsedGame.cover_v3?.url;
            parsedGame.publishers = parsedGame.involved_companies?.Where(a => a.publisher == true).Select(a => a.company.name).ToList();
            parsedGame.developers = parsedGame.involved_companies?.Where(a => a.developer == true).Select(a => a.company.name).ToList();
            parsedGame.genres     = parsedGame.genres_v3?.Select(a => a.name).ToList();
            parsedGame.game_modes = parsedGame.game_modes_v3?.Select(a => a.name).ToList();
            return(parsedGame);
        }
Exemple #4
0
        public async Task <ServicesResponse <ExpandedGame> > Post([FromBody] SdkModels.Game game)
        {
            var   isKnownPlugin = game.PluginId != Guid.Empty;
            var   isSteamPlugin = BuiltinExtensions.GetIdFromExtension(BuiltinExtension.SteamLibrary) == game.PluginId;
            ulong igdbId        = 0;
            var   matchId       = $"{game.GameId}{game.PluginId}".MD5();
            var   searchId      = $"{game.Name}{game.ReleaseDate?.Year}".MD5();

            logger.Debug($"IGDB metadata: {game.GameId},{game.Name},{game.PluginId},{game.ReleaseDate}");

            // Check if match was previously found
            if (isKnownPlugin)
            {
                if (isSteamPlugin)
                {
                    igdbId = await GamesBySteamIdController.GetIgdbMatch(ulong.Parse(game.GameId));
                }
                else
                {
                    var match = Database.IGBDGameIdMatches.FindById(matchId);
                    if (match != null)
                    {
                        igdbId = match.IgdbId;
                    }
                }
            }

            if (igdbId == 0)
            {
                var match = Database.IGDBSearchIdMatches.FindById(searchId);
                if (match != null)
                {
                    igdbId = match.IgdbId;
                }
            }

            var foundMetadata = new ExpandedGame();

            if (igdbId != 0)
            {
                return(new ServicesResponse <ExpandedGame>(await GameParsedController.GetExpandedGame(igdbId)));
            }
            else
            {
                igdbId = await TryMatchGame(game);

                if (igdbId != 0)
                {
                    foundMetadata = await GameParsedController.GetExpandedGame(igdbId);
                }
            }

            // Update match database if match was found
            if (igdbId != 0)
            {
                if (isKnownPlugin && !isSteamPlugin)
                {
                    Database.IGBDGameIdMatches.Upsert(new GameIdMatch
                    {
                        GameId  = game.GameId,
                        Id      = matchId,
                        IgdbId  = igdbId,
                        Library = game.PluginId
                    });
                }

                Database.IGDBSearchIdMatches.Upsert(new SearchIdMatch
                {
                    Term   = game.Name,
                    Id     = searchId,
                    IgdbId = igdbId
                });
            }

            return(new ServicesResponse <ExpandedGame>(foundMetadata));
        }
Exemple #5
0
        public async Task <ServicesResponse <ExpandedGame> > Get(ulong gameId)
        {
            var game = (await new GameController().Get(gameId)).Data;

            if (game.id == 0)
            {
                new ServicesResponse <ExpandedGame>(new ExpandedGame());
            }

            var parsedGame = new ExpandedGame()
            {
                id                 = game.id,
                name               = game.name,
                slug               = game.slug,
                url                = game.url,
                summary            = game.summary,
                storyline          = game.storyline,
                popularity         = game.popularity,
                version_title      = game.version_title,
                category           = game.category,
                first_release_date = game.first_release_date,
                rating             = game.rating,
                aggregated_rating  = game.aggregated_rating,
                total_rating       = game.total_rating
            };

            if (game.alternative_names?.Any() == true)
            {
                parsedGame.alternative_names = new List <AlternativeName>();
                foreach (var nameId in game.alternative_names)
                {
                    parsedGame.alternative_names.Add((await AlternativeNameController.GetItem(nameId)).Data);
                }
            }

            if (game.involved_companies?.Any() == true)
            {
                parsedGame.involved_companies = new List <ExpandedInvolvedCompany>();
                foreach (var companyId in game.involved_companies)
                {
                    parsedGame.involved_companies.Add((await InvolvedCompanyController.GetItem(companyId)).Data);
                }
            }

            if (game.genres?.Any() == true)
            {
                parsedGame.genres_v3 = new List <Genre>();
                foreach (var genreId in game.genres)
                {
                    parsedGame.genres_v3.Add((await GenreController.GetItem(genreId)).Data);
                }
            }

            if (game.websites?.Any() == true)
            {
                parsedGame.websites = new List <Website>();
                foreach (var websiteId in game.websites)
                {
                    parsedGame.websites.Add((await WebsiteController.GetItem(websiteId)).Data);
                }
            }

            if (game.game_modes?.Any() == true)
            {
                parsedGame.game_modes_v3 = new List <GameMode>();
                foreach (var modeId in game.game_modes)
                {
                    parsedGame.game_modes_v3.Add((await GameModeController.GetItem(modeId)).Data);
                }
            }

            if (game.cover > 0)
            {
                parsedGame.cover_v3 = (await CoverController.GetItem(game.cover)).Data;
            }

            // fallback properties for 4.x
            parsedGame.cover              = parsedGame.cover_v3?.url;
            parsedGame.publishers         = parsedGame.involved_companies?.Where(a => a.publisher == true).Select(a => a.company.name).ToList();
            parsedGame.developers         = parsedGame.involved_companies?.Where(a => a.developer == true).Select(a => a.company.name).ToList();
            parsedGame.genres             = parsedGame.genres_v3?.Select(a => a.name).ToList();
            parsedGame.game_modes         = parsedGame.game_modes_v3?.Select(a => a.name).ToList();
            parsedGame.first_release_date = parsedGame.first_release_date * 1000;

            return(new ServicesResponse <ExpandedGame>(parsedGame));
        }
Exemple #6
0
        public async Task <ExpandedGame> GetExpandedGame(ulong gameId)
        {
            var game = await igdbApi.Games.Get(gameId);

            if (game.id == 0)
            {
                new ExpandedGame();
            }

            var parsedGame = new ExpandedGame()
            {
                id                 = game.id,
                name               = game.name,
                slug               = game.slug,
                url                = game.url,
                summary            = game.summary,
                storyline          = game.storyline,
                popularity         = game.popularity,
                version_title      = game.version_title,
                category           = game.category,
                first_release_date = game.first_release_date * 1000,
                rating             = game.rating,
                aggregated_rating  = game.aggregated_rating,
                total_rating       = game.total_rating
            };

            if (game.alternative_names?.Any() == true)
            {
                parsedGame.alternative_names = new List <AlternativeName>();
                foreach (var nameId in game.alternative_names)
                {
                    parsedGame.alternative_names.Add(await igdbApi.AlternativeNames.Get(nameId));
                }
            }

            if (game.involved_companies?.Any() == true)
            {
                parsedGame.involved_companies = new List <ExpandedInvolvedCompany>();
                foreach (var companyId in game.involved_companies)
                {
                    parsedGame.involved_companies.Add(await igdbApi.InvolvedCompanies.GetItem(companyId));
                }
            }

            if (game.genres?.Any() == true)
            {
                parsedGame.genres = new List <Genre>();
                foreach (var genreId in game.genres)
                {
                    parsedGame.genres.Add(await igdbApi.Genres.Get(genreId));
                }
            }

            if (game.websites?.Any() == true)
            {
                parsedGame.websites = new List <Website>();
                foreach (var websiteId in game.websites)
                {
                    parsedGame.websites.Add(await igdbApi.Websites.Get(websiteId));
                }
            }

            if (game.game_modes?.Any() == true)
            {
                parsedGame.game_modes = new List <GameMode>();
                foreach (var modeId in game.game_modes)
                {
                    parsedGame.game_modes.Add(await igdbApi.GameModes.Get(modeId));
                }
            }

            if (game.player_perspectives?.Any() == true)
            {
                parsedGame.player_perspectives = new List <PlayerPerspective>();
                foreach (var persId in game.player_perspectives)
                {
                    parsedGame.player_perspectives.Add(await igdbApi.PlayerPerspectives.Get(persId));
                }
            }

            if (game.cover > 0)
            {
                parsedGame.cover = await igdbApi.Covers.Get(game.cover);
            }

            if (game.artworks?.Any() == true)
            {
                parsedGame.artworks = new List <GameImage>();
                foreach (var artworkId in game.artworks)
                {
                    parsedGame.artworks.Add(await igdbApi.Artworks.Get(artworkId));
                }
            }

            if (game.screenshots?.Any() == true)
            {
                parsedGame.screenshots = new List <GameImage>();
                foreach (var screenshotId in game.screenshots)
                {
                    parsedGame.screenshots.Add(await igdbApi.Screenshots.Get(screenshotId));
                }
            }

            if (game.age_ratings?.Any() == true)
            {
                parsedGame.age_ratings = new List <AgeRating>();
                foreach (var ageId in game.age_ratings)
                {
                    parsedGame.age_ratings.Add(await igdbApi.AgeRatings.Get(ageId));
                }
            }

            if (game.collection > 0)
            {
                parsedGame.collection = await igdbApi.Collections.Get(game.collection);
            }

            return(parsedGame);
        }
Exemple #7
0
        public static async Task <List <ExpandedGame> > GetSearchResults(string searchString)
        {
            List <Game> searchResult = null;

            searchString = ModelsUtils.GetIgdbSearchString(searchString);
            var cachePath = Path.Combine(IGDB.CacheDirectory, cacheDir, Playnite.Common.Paths.GetSafeFilename(searchString) + ".json");

            lock (CacheLock)
            {
                if (System.IO.File.Exists(cachePath))
                {
                    var fileInfo = new FileInfo(cachePath);
                    fileInfo.Refresh();
                    if ((DateTime.Now - fileInfo.LastWriteTime).TotalHours <= IGDB.SearchCacheTimeout)
                    {
                        using (var fs = new FileStream(cachePath, FileMode.Open, FileAccess.Read))
                            using (var sr = new StreamReader(fs))
                                using (var reader = new JsonTextReader(sr))
                                {
                                    searchResult = jsonSerializer.Deserialize <List <Game> >(reader);
                                }
                    }
                }
            }

            if (searchResult == null)
            {
                var libraryStringResult = await IGDB.SendStringRequest("games", $"search \"{HttpUtility.UrlDecode(searchString)}\"; fields id; limit 40;");

                searchResult = JsonConvert.DeserializeObject <List <Game> >(libraryStringResult);
                lock (CacheLock)
                {
                    Playnite.Common.FileSystem.PrepareSaveFile(cachePath);
                    System.IO.File.WriteAllText(cachePath, libraryStringResult);
                }
            }

            var finalResult = new List <ExpandedGame>();

            for (int i = 0; i < searchResult.Count; i++)
            {
                Game result = null;
                try
                {
                    result = (await GameController.GetItem(searchResult[i].id)).Data;
                }
                catch (Exception e)
                {
                    logger.Error(e, $"Failed to get game {searchResult[i].id}");
                    continue;
                }

                if (result.id == 0)
                {
                    continue;
                }

                var xpanded = new ExpandedGame()
                {
                    id   = result.id,
                    name = result.name,
                    first_release_date = result.first_release_date * 1000
                };

                if (result.alternative_names?.Any() == true)
                {
                    xpanded.alternative_names = new List <AlternativeName>();
                    foreach (var nameId in result.alternative_names)
                    {
                        xpanded.alternative_names.Add((await AlternativeNameController.GetItem(nameId)).Data);
                    }
                }

                finalResult.Add(xpanded);
            }

            return(finalResult);
        }