Exemplo n.º 1
0
        internal GameMetadata GetGameMetadata(GameID gameId)
        {
            var appId = gameId.AppID;
            var downloadedMetadata = DownloadGameMetadata(appId, library.LibrarySettings.BackgroundSource);
            var gameInfo           = new GameInfo
            {
                Name  = downloadedMetadata.ProductDetails?["common"]["name"]?.Value ?? downloadedMetadata.GameInfo.Name,
                Links = new List <Link>()
                {
                    new Link("Forum", $"https://steamcommunity.com/app/{appId}"),
                    new Link("News", $"https://store.steampowered.com/news/?appids={appId}"),
                    new Link("Store", $"https://store.steampowered.com/app/{appId}"),
                    new Link("Wiki", $"https://pcgamingwiki.com/api/appid.php?appid={appId}")
                }
            };

            downloadedMetadata.GameInfo = gameInfo;

            var metadata = new GameMetadata()
            {
                GameInfo        = gameInfo,
                Icon            = downloadedMetadata.Icon,
                CoverImage      = downloadedMetadata.CoverImage,
                BackgroundImage = downloadedMetadata.BackgroundImage
            };

            if (downloadedMetadata.StoreDetails?.categories?.FirstOrDefault(a => a.id == 30) != null)
            {
                gameInfo.Links.Add(new Link("Workshop", Steam.GetWorkshopUrl(appId)));
            }

            if (downloadedMetadata.StoreDetails != null)
            {
                gameInfo.Description = ParseDescription(downloadedMetadata.StoreDetails.detailed_description);
                var cultInfo = new CultureInfo("en-US", false).TextInfo;
                gameInfo.ReleaseDate = downloadedMetadata.StoreDetails.release_date.date;
                gameInfo.CriticScore = downloadedMetadata.StoreDetails.metacritic?.score;

                if (downloadedMetadata.StoreDetails.publishers.HasNonEmptyItems())
                {
                    gameInfo.Publishers = new List <string>(downloadedMetadata.StoreDetails.publishers);
                }

                if (downloadedMetadata.StoreDetails.developers.HasNonEmptyItems())
                {
                    gameInfo.Developers = new List <string>(downloadedMetadata.StoreDetails.developers);
                }

                if (downloadedMetadata.StoreDetails.categories.HasItems())
                {
                    gameInfo.Tags = new List <string>(downloadedMetadata.StoreDetails.categories.Select(a => cultInfo.ToTitleCase(a.description)));
                }

                if (downloadedMetadata.StoreDetails.genres.HasItems())
                {
                    gameInfo.Genres = new List <string>(downloadedMetadata.StoreDetails.genres.Select(a => a.description));
                }
            }

            if (downloadedMetadata.ProductDetails != null)
            {
                var tasks      = new List <GameAction>();
                var launchList = downloadedMetadata.ProductDetails["config"]["launch"].Children;
                foreach (var task in launchList.Skip(1))
                {
                    var properties = task["config"];
                    if (properties.Name != null)
                    {
                        if (properties["oslist"].Name != null)
                        {
                            if (properties["oslist"].Value != "windows")
                            {
                                continue;
                            }
                        }
                    }

                    // Ignore action without name  - shoudn't be visible to end user
                    if (task["description"].Name != null)
                    {
                        var newTask = new GameAction()
                        {
                            Name              = task["description"].Value,
                            Arguments         = task["arguments"].Value ?? string.Empty,
                            Path              = task["executable"].Value,
                            IsHandledByPlugin = false,
                            WorkingDir        = ExpandableVariables.InstallationDirectory
                        };

                        tasks.Add(newTask);
                    }
                }

                var manual = downloadedMetadata.ProductDetails["extended"]["gamemanualurl"];
                if (manual.Name != null)
                {
                    tasks.Add((new GameAction()
                    {
                        Name = "Manual",
                        Type = GameActionType.URL,
                        Path = manual.Value,
                        IsHandledByPlugin = false
                    }));
                }

                gameInfo.OtherActions = tasks;
            }

            return(downloadedMetadata);
        }
Exemplo n.º 2
0
        internal SteamGameMetadata UpdateGameWithMetadata(Game game)
        {
            var appId    = game.ToSteamGameID().AppID;
            var metadata = DownloadGameMetadata(appId, library.LibrarySettings.BackgroundSource);

            game.Name  = metadata.ProductDetails?["common"]["name"]?.Value ?? game.Name;
            game.Links = new ObservableCollection <Link>()
            {
                new Link("Forum", @"https://steamcommunity.com/app/" + appId),
                new Link("News", @"http://store.steampowered.com/news/?appids=" + appId),
                new Link("Store", @"http://store.steampowered.com/app/" + appId),
                new Link("Wiki", @"http://pcgamingwiki.com/api/appid.php?appid=" + appId)
            };

            if (metadata.StoreDetails?.categories?.FirstOrDefault(a => a.id == 30) != null)
            {
                game.Links.Add(new Link("Workshop", Steam.GetWorkshopUrl(appId)));
            }

            if (metadata.StoreDetails != null)
            {
                game.Description = metadata.StoreDetails.detailed_description;
                game.Genres      = new ComparableList <string>(metadata.StoreDetails.genres?.Select(a => a.description));
                game.Developers  = new ComparableList <string>(metadata.StoreDetails.developers);
                game.Publishers  = new ComparableList <string>(metadata.StoreDetails.publishers);
                var cultInfo = new CultureInfo("en-US", false).TextInfo;
                game.Tags        = new ComparableList <string>(metadata.StoreDetails.categories?.Select(a => cultInfo.ToTitleCase(a.description)));
                game.ReleaseDate = metadata.StoreDetails.release_date.date;
                game.CriticScore = metadata.StoreDetails.metacritic?.score;
            }

            if (metadata.ProductDetails != null)
            {
                var tasks      = new ObservableCollection <GameAction>();
                var launchList = metadata.ProductDetails["config"]["launch"].Children;
                foreach (var task in launchList.Skip(1))
                {
                    var properties = task["config"];
                    if (properties.Name != null)
                    {
                        if (properties["oslist"].Name != null)
                        {
                            if (properties["oslist"].Value != "windows")
                            {
                                continue;
                            }
                        }
                    }

                    // Ignore action without name  - shoudn't be visible to end user
                    if (task["description"].Name != null)
                    {
                        var newTask = new GameAction()
                        {
                            Name              = task["description"].Value,
                            Arguments         = task["arguments"].Value ?? string.Empty,
                            Path              = task["executable"].Value,
                            IsHandledByPlugin = false,
                            WorkingDir        = "{InstallDir}"
                        };

                        tasks.Add(newTask);
                    }
                }

                var manual = metadata.ProductDetails["extended"]["gamemanualurl"];
                if (manual.Name != null)
                {
                    tasks.Add((new GameAction()
                    {
                        Name = "Manual",
                        Type = GameActionType.URL,
                        Path = manual.Value,
                        IsHandledByPlugin = false
                    }));
                }

                game.OtherActions = tasks;
            }

            if (!string.IsNullOrEmpty(metadata.BackgroundImage))
            {
                game.BackgroundImage = metadata.BackgroundImage;
            }

            return(metadata);
        }
Exemplo n.º 3
0
        internal GameMetadata GetGameMetadata(GameID gameId)
        {
            var resources          = library.PlayniteApi.Resources;
            var appId              = gameId.AppID;
            var downloadedMetadata = DownloadGameMetadata(appId, library.LibrarySettings);
            var gameInfo           = new GameInfo
            {
                Name  = downloadedMetadata.ProductDetails?["common"]["name"]?.Value ?? downloadedMetadata.GameInfo.Name,
                Links = new List <Link>()
                {
                    new Link(resources.GetString("LOCSteamLinksCommunityHub"), $"https://steamcommunity.com/app/{appId}"),
                    new Link(resources.GetString("LOCSteamLinksDiscussions"), $"https://steamcommunity.com/app/{appId}/discussions/"),
                    new Link(resources.GetString("LOCCommonLinksNews"), $"https://store.steampowered.com/news/?appids={appId}"),
                    new Link(resources.GetString("LOCCommonLinksStorePage"), $"https://store.steampowered.com/app/{appId}"),
                    new Link("PCGamingWiki", $"https://pcgamingwiki.com/api/appid.php?appid={appId}")
                }
            };

            downloadedMetadata.GameInfo = gameInfo;

            var metadata = new GameMetadata()
            {
                GameInfo        = gameInfo,
                Icon            = downloadedMetadata.Icon,
                CoverImage      = downloadedMetadata.CoverImage,
                BackgroundImage = downloadedMetadata.BackgroundImage
            };

            if (downloadedMetadata.StoreDetails?.categories?.FirstOrDefault(a => a.id == 22) != null)
            {
                gameInfo.Links.Add(new Link(resources.GetString("LOCCommonLinksAchievements"), Steam.GetAchievementsUrl(appId)));
            }

            if (downloadedMetadata.StoreDetails?.categories?.FirstOrDefault(a => a.id == 30) != null)
            {
                gameInfo.Links.Add(new Link(resources.GetString("LOCSteamLinksWorkshop"), Steam.GetWorkshopUrl(appId)));
            }

            if (downloadedMetadata.StoreDetails != null)
            {
                gameInfo.Description = ParseDescription(downloadedMetadata.StoreDetails.detailed_description);
                var cultInfo = new CultureInfo("en-US", false).TextInfo;
                gameInfo.ReleaseDate = downloadedMetadata.StoreDetails.release_date.date;
                gameInfo.CriticScore = downloadedMetadata.StoreDetails.metacritic?.score;

                if (downloadedMetadata.StoreDetails.publishers.HasNonEmptyItems())
                {
                    gameInfo.Publishers = new List <string>(downloadedMetadata.StoreDetails.publishers);
                }

                if (downloadedMetadata.StoreDetails.developers.HasNonEmptyItems())
                {
                    gameInfo.Developers = new List <string>(downloadedMetadata.StoreDetails.developers);
                }

                if (downloadedMetadata.StoreDetails.categories.HasItems())
                {
                    gameInfo.Features = new List <string>();
                    foreach (var category in downloadedMetadata.StoreDetails.categories)
                    {
                        // Ignore VR category, will be set from appinfo
                        if (category.id == 31)
                        {
                            continue;
                        }

                        if (category.description == "Steam Cloud")
                        {
                            category.description = "Cloud Saves";
                        }

                        gameInfo.Features.Add(cultInfo.ToTitleCase(category.description.Replace("steam", "", StringComparison.OrdinalIgnoreCase).Trim()));
                    }
                }

                if (downloadedMetadata.StoreDetails.genres.HasItems())
                {
                    gameInfo.Genres = new List <string>(downloadedMetadata.StoreDetails.genres.Select(a => a.description));
                }
            }

            if (downloadedMetadata.ProductDetails != null)
            {
                var tasks      = new List <GameAction>();
                var launchList = downloadedMetadata.ProductDetails["config"]["launch"].Children;
                foreach (var task in launchList.Skip(1))
                {
                    var properties = task["config"];
                    if (properties.Name != null)
                    {
                        if (properties["oslist"].Name != null)
                        {
                            if (properties["oslist"].Value != "windows")
                            {
                                continue;
                            }
                        }
                    }

                    // Ignore action without name  - shoudn't be visible to end user
                    if (task["description"].Name != null)
                    {
                        var newTask = new GameAction()
                        {
                            Name              = task["description"].Value,
                            Arguments         = task["arguments"].Value ?? string.Empty,
                            Path              = task["executable"].Value,
                            IsHandledByPlugin = false,
                            WorkingDir        = ExpandableVariables.InstallationDirectory
                        };

                        tasks.Add(newTask);
                    }
                }

                var manual = downloadedMetadata.ProductDetails["extended"]["gamemanualurl"];
                if (manual.Name != null)
                {
                    tasks.Add((new GameAction()
                    {
                        Name = "Manual",
                        Type = GameActionType.URL,
                        Path = manual.Value,
                        IsHandledByPlugin = false
                    }));
                }

                gameInfo.OtherActions = tasks;

                // VR features
                var vrSupport = false;
                foreach (var vrArea in downloadedMetadata.ProductDetails["common"]["playareavr"].Children)
                {
                    if (vrArea.Name == "seated" && vrArea.Value == "1")
                    {
                        gameInfo.Features.Add("VR Seated");
                        vrSupport = true;
                    }
                    else if (vrArea.Name == "standing" && vrArea.Value == "1")
                    {
                        gameInfo.Features.Add("VR Standing");
                        vrSupport = true;
                    }
                    if (vrArea.Name.Contains("roomscale"))
                    {
                        gameInfo.Features.AddMissing("VR Room-Scale");
                        vrSupport = true;
                    }
                }

                foreach (var vrArea in downloadedMetadata.ProductDetails["common"]["controllervr"].Children)
                {
                    if (vrArea.Name == "kbm" && vrArea.Value == "1")
                    {
                        gameInfo.Features.Add("VR Keyboard / Mouse");
                        vrSupport = true;
                    }
                    else if (vrArea.Name == "xinput" && vrArea.Value == "1")
                    {
                        gameInfo.Features.Add("VR Gamepad");
                        vrSupport = true;
                    }
                    if ((vrArea.Name == "oculus" && vrArea.Value == "1") ||
                        (vrArea.Name == "steamvr" && vrArea.Value == "1"))
                    {
                        gameInfo.Features.Add("VR Motion Controllers");
                        vrSupport = true;
                    }
                }

                if (vrSupport)
                {
                    gameInfo.Features.Add("VR");
                }
            }

            return(downloadedMetadata);
        }