Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 27 additions & 19 deletions source/Libraries/SteamLibrary/SteamLibrary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
using SteamLibrary.Models;
using SteamLibrary.Services;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
Expand Down Expand Up @@ -50,6 +52,7 @@ public enum AppStateFlags
public class SteamLibrary : LibraryPluginBase<SteamLibrarySettingsViewModel>
{
private static readonly ILogger logger = LogManager.GetLogger();
private const int libScanParallelismDegree = 3;
private readonly Configuration config;
internal SteamServicesClient ServicesClient;
internal TopPanelItem TopPanelFriendsButton;
Expand Down Expand Up @@ -162,27 +165,27 @@ internal static GameMetadata GetInstalledGameFromFile(string path)

internal static List<GameMetadata> GetInstalledGamesFromFolder(string path)
{
var games = new List<GameMetadata>();

foreach (var file in Directory.GetFiles(path, @"appmanifest*"))
var games = new ConcurrentBag<GameMetadata>();
var appManifests = Directory.GetFiles(path, @"appmanifest*");
Parallel.ForEach(appManifests, new ParallelOptions { MaxDegreeOfParallelism = libScanParallelismDegree }, file =>
{
if (file.EndsWith("tmp", StringComparison.OrdinalIgnoreCase))
{
continue;
return;
}

try
{
var game = GetInstalledGameFromFile(Path.Combine(path, file));
if (game == null)
{
continue;
return;
}

if (game.InstallDirectory.IsNullOrEmpty() || game.InstallDirectory.Contains(@"steamapps\music"))
{
logger.Info($"Steam game {game.Name} is not properly installed or it's a soundtrack, skipping.");
continue;
return;
}

games.Add(game);
Expand All @@ -192,17 +195,22 @@ internal static List<GameMetadata> GetInstalledGamesFromFolder(string path)
// Steam can generate invalid acf file according to issue #37
logger.Error(exc, $"Failed to get information about installed game from: {file}");
}
}
});

return games;
return games.ToList();
}

internal static List<GameMetadata> GetInstalledGoldSrcModsFromFolder(string path)
{
var games = new List<GameMetadata>();
var games = new ConcurrentBag<GameMetadata>();
var dirInfo = new DirectoryInfo(path);

foreach (var folder in dirInfo.GetDirectories().Where(a => !firstPartyModPrefixes.Any(prefix => a.Name.StartsWith(prefix))).Select(a => a.FullName))
var filteredDirectories = dirInfo.GetDirectories()
.Where(a => !firstPartyModPrefixes.Any(prefix => a.Name.StartsWith(prefix)))
.Select(a => a.FullName)
.ToList();

Parallel.ForEach(filteredDirectories, new ParallelOptions { MaxDegreeOfParallelism = libScanParallelismDegree }, folder =>
{
try
{
Expand All @@ -215,18 +223,18 @@ internal static List<GameMetadata> GetInstalledGoldSrcModsFromFolder(string path
catch (Exception exc)
{
// GameMetadata.txt may not exist or may be invalid
logger.Error(exc, $"Failed to get information about installed GoldSrc mod from: {path}");
logger.Error(exc, $"Failed to get information about installed GoldSrc mod from Path: {path}, Folder: {folder}");
}
}
});

return games;
return games.ToList();
}

internal static List<GameMetadata> GetInstalledSourceModsFromFolder(string path)
{
var games = new List<GameMetadata>();

foreach (var folder in Directory.GetDirectories(path))
var games = new ConcurrentBag<GameMetadata>();
var directories = Directory.GetDirectories(path);
Parallel.ForEach(directories, new ParallelOptions { MaxDegreeOfParallelism = libScanParallelismDegree }, folder =>
{
try
{
Expand All @@ -239,11 +247,11 @@ internal static List<GameMetadata> GetInstalledSourceModsFromFolder(string path)
catch (Exception exc)
{
// GameMetadata.txt may not exist or may be invalid
logger.Error(exc, $"Failed to get information about installed Source mod from: {path}");
logger.Error(exc, $"Failed to get information about installed Source mod Path: {path}, Folder: {folder}");
}
}
});

return games;
return games.ToList();
}

internal static GameMetadata GetInstalledModFromFolder(string path, ModInfo.ModType modType)
Expand Down