private void GetIgdbMetadata()
        {
            if (IgdbData != null)
            {
                return;
            }

            if (gameId != 0)
            {
                IgdbData = plugin.Client.GetIGDBGameParsed(gameId);
                return;
            }

            if (!options.IsBackgroundDownload)
            {
                var item = plugin.PlayniteApi.Dialogs.ChooseItemWithSearch(null, (a) =>
                {
                    if (a.StartsWith("http", StringComparison.OrdinalIgnoreCase))
                    {
                        try
                        {
                            var gameId = GetGameInfoFromUrl(a);
                            var data   = plugin.Client.GetIGDBGameParsed(ulong.Parse(gameId));
                            return(new List <GenericItemOption> {
                                new SearchResult(gameId, data.name)
                            });
                        }
                        catch (Exception e)
                        {
                            logger.Error(e, $"Failed to get game data from {a}");
                            return(new List <GenericItemOption>());
                        }
                    }
                    else
                    {
                        var res = plugin.GetSearchResults(a);
                        return(res.Select(b => b as GenericItemOption).ToList());
                    }
                }, options.GameData.Name);

                if (item != null)
                {
                    var searchItem = item as SearchResult;
                    IgdbData = plugin.Client.GetIGDBGameParsed(ulong.Parse(searchItem.Id));
                }
                else
                {
                    IgdbData = new IgdbServerModels.ExpandedGame()
                    {
                        id = 0
                    };
                }
            }
            else
            {
                var game = options.GameData;
                if (BuiltinExtensions.GetExtensionFromId(game.PluginId) == BuiltinExtension.SteamLibrary)
                {
                    var igdbId = plugin.Client.GetIGDBGameBySteamId(game.GameId);
                    if (igdbId != 0)
                    {
                        IgdbData = plugin.Client.GetIGDBGameParsed(igdbId);
                        return;
                    }
                }

                if (game.Name.IsNullOrEmpty())
                {
                    IgdbData = new IgdbServerModels.ExpandedGame()
                    {
                        id = 0
                    };
                    return;
                }

                var copyGame = game.GetClone();
                copyGame.Name = StringExtensions.NormalizeGameName(game.Name);
                var name = copyGame.Name
                           .Replace(" RHCP", "", StringComparison.OrdinalIgnoreCase)
                           .Replace(" RU", "", StringComparison.OrdinalIgnoreCase);
                var results = plugin.GetSearchResults(plugin.GetIgdbSearchString(name)).ToList();
                results.ForEach(a => a.Name = StringExtensions.NormalizeGameName(a.Name));
                string testName = string.Empty;

                // Direct comparison
                IgdbData = matchFun(game, name, results);
                if (IgdbData != null)
                {
                    return;
                }

                // Try replacing roman numerals: 3 => III
                testName = Regex.Replace(name, @"\d+", ReplaceNumsForRomans);
                IgdbData = matchFun(game, testName, results);
                if (IgdbData != null)
                {
                    return;
                }

                // Try adding The
                testName = "The " + name;
                IgdbData = matchFun(game, testName, results);
                if (IgdbData != null)
                {
                    return;
                }

                // Try chaning & / and
                testName = Regex.Replace(name, @"\s+and\s+", " & ", RegexOptions.IgnoreCase);
                IgdbData = matchFun(game, testName, results);
                if (IgdbData != null)
                {
                    return;
                }

                // Try removing apostrophes
                var resCopy = results.GetClone();
                resCopy.ForEach(a => a.Name = a.Name.Replace("'", ""));
                IgdbData = matchFun(game, name, resCopy);
                if (IgdbData != null)
                {
                    return;
                }

                // Try removing all ":" and "-"
                testName = Regex.Replace(name, @"\s*(:|-)\s*", " ");
                resCopy  = results.GetClone();
                resCopy.ForEach(a => a.Name = Regex.Replace(a.Name, @"\s*(:|-)\s*", " "));
                IgdbData = matchFun(game, testName, resCopy);
                if (IgdbData != null)
                {
                    return;
                }

                // Try without subtitle
                var testResult = results.OrderBy(a => a.ReleaseDate).FirstOrDefault(a =>
                {
                    if (a.ReleaseDate == null)
                    {
                        return(false);
                    }

                    if (!string.IsNullOrEmpty(a.Name) && a.Name.Contains(":"))
                    {
                        return(string.Equals(name, a.Name.Split(':')[0], StringComparison.InvariantCultureIgnoreCase));
                    }

                    return(false);
                });

                if (testResult != null)
                {
                    IgdbData = plugin.Client.GetIGDBGameParsed(ulong.Parse(testResult.Id));
                    return;
                }

                // No match found
                IgdbData = new IgdbServerModels.ExpandedGame()
                {
                    id = 0
                };
            }
        }
예제 #2
0
        private void GetIgdbMetadata()
        {
            if (IgdbData != null)
            {
                return;
            }

            if (!options.IsBackgroundDownload)
            {
                var item = plugin.PlayniteApi.Dialogs.ChooseItemWithSearch(null, (a) =>
                {
                    if (a.StartsWith("http", StringComparison.OrdinalIgnoreCase))
                    {
                        try
                        {
                            var gameId = GetGameInfoFromUrl(a);
                            var data   = plugin.Client.GetIGDBGameExpanded(ulong.Parse(gameId));
                            return(new List <GenericItemOption> {
                                new SearchResult(gameId, data.name)
                            });
                        }
                        catch (Exception e)
                        {
                            logger.Error(e, $"Failed to get game data from {a}");
                            return(new List <GenericItemOption>());
                        }
                    }
                    else
                    {
                        var res = plugin.GetSearchResults(a);
                        return(res.Select(b => b as GenericItemOption).ToList());
                    }
                }, options.GameData.Name);

                if (item != null)
                {
                    var searchItem = item as SearchResult;
                    IgdbData = plugin.Client.GetIGDBGameExpanded(ulong.Parse(searchItem.Id));
                }
                else
                {
                    IgdbData = new IgdbServerModels.ExpandedGame()
                    {
                        id = 0
                    };
                }
            }
            else
            {
                try
                {
                    var metadata = plugin.Client.GetMetadata(options.GameData);
                    if (metadata.id > 0)
                    {
                        IgdbData = metadata;
                    }
                    else
                    {
                        IgdbData = new IgdbServerModels.ExpandedGame()
                        {
                            id = 0
                        };
                    }
                }
                catch (Exception e)
                {
                    logger.Error(e, "Failed to get IGDB metadata.");
                    IgdbData = new IgdbServerModels.ExpandedGame()
                    {
                        id = 0
                    };
                }
            }
        }