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); }
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); }
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); }