mirror of
https://github.com/SteamRE/DepotDownloader.git
synced 2026-10-20 01:46:17 +00:00
Merge pull request #286 from SteamRE/sk-2.4.0
Update to SteamKit2 2.4.0, net6.0
This commit is contained in:
6 files changed
+42
-48
No files matched your search
@@ -24,10 +24,15 @@ jobs:
|
|||||||
configuration: [Release, Debug]
|
configuration: [Release, Debug]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Setup .NET Core
|
- name: Setup .NET Core
|
||||||
uses: actions/setup-dotnet@v1
|
uses: actions/setup-dotnet@v1
|
||||||
|
with:
|
||||||
|
dotnet-version: '6.0.x'
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dotnet publish -c ${{ matrix.configuration }} -o artifacts
|
run: dotnet publish -c ${{ matrix.configuration }} -o artifacts
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
if: matrix.configuration == 'Release'
|
if: matrix.configuration == 'Release'
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using SteamKit2;
|
using SteamKit2.CDN;
|
||||||
|
|
||||||
namespace DepotDownloader
|
namespace DepotDownloader
|
||||||
{
|
{
|
||||||
@@ -18,11 +17,11 @@ namespace DepotDownloader
|
|||||||
|
|
||||||
private readonly Steam3Session steamSession;
|
private readonly Steam3Session steamSession;
|
||||||
private readonly uint appId;
|
private readonly uint appId;
|
||||||
public CDNClient CDNClient { get; }
|
public Client CDNClient { get; }
|
||||||
public CDNClient.Server ProxyServer { get; private set; }
|
public Server ProxyServer { get; private set; }
|
||||||
|
|
||||||
private readonly ConcurrentStack<CDNClient.Server> activeConnectionPool;
|
private readonly ConcurrentStack<Server> activeConnectionPool;
|
||||||
private readonly BlockingCollection<CDNClient.Server> availableServerEndpoints;
|
private readonly BlockingCollection<Server> availableServerEndpoints;
|
||||||
|
|
||||||
private readonly AutoResetEvent populatePoolEvent;
|
private readonly AutoResetEvent populatePoolEvent;
|
||||||
private readonly Task monitorTask;
|
private readonly Task monitorTask;
|
||||||
@@ -33,10 +32,10 @@ namespace DepotDownloader
|
|||||||
{
|
{
|
||||||
this.steamSession = steamSession;
|
this.steamSession = steamSession;
|
||||||
this.appId = appId;
|
this.appId = appId;
|
||||||
CDNClient = new CDNClient(steamSession.steamClient);
|
CDNClient = new Client(steamSession.steamClient);
|
||||||
|
|
||||||
activeConnectionPool = new ConcurrentStack<CDNClient.Server>();
|
activeConnectionPool = new ConcurrentStack<Server>();
|
||||||
availableServerEndpoints = new BlockingCollection<CDNClient.Server>();
|
availableServerEndpoints = new BlockingCollection<Server>();
|
||||||
|
|
||||||
populatePoolEvent = new AutoResetEvent(true);
|
populatePoolEvent = new AutoResetEvent(true);
|
||||||
shutdownToken = new CancellationTokenSource();
|
shutdownToken = new CancellationTokenSource();
|
||||||
@@ -50,32 +49,20 @@ namespace DepotDownloader
|
|||||||
monitorTask.Wait();
|
monitorTask.Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IReadOnlyCollection<CDNClient.Server>> FetchBootstrapServerListAsync()
|
private async Task<IReadOnlyCollection<Server>> FetchBootstrapServerListAsync()
|
||||||
{
|
{
|
||||||
var backoffDelay = 0;
|
try
|
||||||
|
|
||||||
while (!shutdownToken.IsCancellationRequested)
|
|
||||||
{
|
{
|
||||||
try
|
var cdnServers = await this.steamSession.steamContent.GetServersForSteamPipe();
|
||||||
|
if (cdnServers != null)
|
||||||
{
|
{
|
||||||
var cdnServers = await ContentServerDirectoryService.LoadAsync(this.steamSession.steamClient.Configuration, ContentDownloader.Config.CellID, shutdownToken.Token);
|
return cdnServers;
|
||||||
if (cdnServers != null)
|
|
||||||
{
|
|
||||||
return cdnServers;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Failed to retrieve content server list: {0}", ex.Message);
|
|
||||||
|
|
||||||
if (ex is SteamKitWebRequestException e && e.StatusCode == (HttpStatusCode)429)
|
|
||||||
{
|
|
||||||
// If we're being throttled, add a delay to the next request
|
|
||||||
backoffDelay = Math.Min(5, ++backoffDelay);
|
|
||||||
await Task.Delay(TimeSpan.FromSeconds(backoffDelay));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Failed to retrieve content server list: {0}", ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -104,7 +91,7 @@ namespace DepotDownloader
|
|||||||
var weightedCdnServers = servers
|
var weightedCdnServers = servers
|
||||||
.Where(server =>
|
.Where(server =>
|
||||||
{
|
{
|
||||||
var isEligibleForApp = server.AllowedAppIds == null || server.AllowedAppIds.Contains(appId);
|
var isEligibleForApp = server.AllowedAppIds.Length == 0 || server.AllowedAppIds.Contains(appId);
|
||||||
return isEligibleForApp && (server.Type == "SteamCache" || server.Type == "CDN");
|
return isEligibleForApp && (server.Type == "SteamCache" || server.Type == "CDN");
|
||||||
})
|
})
|
||||||
.Select(server =>
|
.Select(server =>
|
||||||
@@ -133,7 +120,7 @@ namespace DepotDownloader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private CDNClient.Server BuildConnection(CancellationToken token)
|
private Server BuildConnection(CancellationToken token)
|
||||||
{
|
{
|
||||||
if (availableServerEndpoints.Count < ServerEndpointMinimumSize)
|
if (availableServerEndpoints.Count < ServerEndpointMinimumSize)
|
||||||
{
|
{
|
||||||
@@ -143,7 +130,7 @@ namespace DepotDownloader
|
|||||||
return availableServerEndpoints.Take(token);
|
return availableServerEndpoints.Take(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CDNClient.Server GetConnection(CancellationToken token)
|
public Server GetConnection(CancellationToken token)
|
||||||
{
|
{
|
||||||
if (!activeConnectionPool.TryPop(out var connection))
|
if (!activeConnectionPool.TryPop(out var connection))
|
||||||
{
|
{
|
||||||
@@ -153,7 +140,7 @@ namespace DepotDownloader
|
|||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> AuthenticateConnection(uint appId, uint depotId, CDNClient.Server server)
|
public async Task<string> AuthenticateConnection(uint appId, uint depotId, Server server)
|
||||||
{
|
{
|
||||||
var host = steamSession.ResolveCDNTopLevelHost(server.Host);
|
var host = steamSession.ResolveCDNTopLevelHost(server.Host);
|
||||||
var cdnKey = $"{depotId:D}:{host}";
|
var cdnKey = $"{depotId:D}:{host}";
|
||||||
@@ -169,14 +156,14 @@ namespace DepotDownloader
|
|||||||
throw new Exception($"Failed to retrieve CDN token for server {server.Host} depot {depotId}");
|
throw new Exception($"Failed to retrieve CDN token for server {server.Host} depot {depotId}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReturnConnection(CDNClient.Server server)
|
public void ReturnConnection(Server server)
|
||||||
{
|
{
|
||||||
if (server == null) return;
|
if (server == null) return;
|
||||||
|
|
||||||
activeConnectionPool.Push(server);
|
activeConnectionPool.Push(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReturnBrokenConnection(CDNClient.Server server)
|
public void ReturnBrokenConnection(Server server)
|
||||||
{
|
{
|
||||||
if (server == null) return;
|
if (server == null) return;
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using SteamKit2;
|
using SteamKit2;
|
||||||
|
using SteamKit2.CDN;
|
||||||
|
|
||||||
namespace DepotDownloader
|
namespace DepotDownloader
|
||||||
{
|
{
|
||||||
@@ -831,15 +831,15 @@ namespace DepotDownloader
|
|||||||
{
|
{
|
||||||
cts.Token.ThrowIfCancellationRequested();
|
cts.Token.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
CDNClient.Server connection = null;
|
Server connection = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
connection = cdnPool.GetConnection(cts.Token);
|
connection = cdnPool.GetConnection(cts.Token);
|
||||||
|
|
||||||
DebugLog.WriteLine("ContentDownloader", "Downloading manifest {0} from {1} with {2}", depot.manifestId, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy");
|
DebugLog.WriteLine("ContentDownloader", "Downloading manifest {0} from {1} with {2}", depot.manifestId, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy");
|
||||||
depotManifest = await cdnPool.CDNClient.DownloadManifestAsync(depot.id, depot.manifestId,
|
depotManifest = await cdnPool.CDNClient.DownloadManifestAsync(depot.id, depot.manifestId, manifestRequestCode: 0,
|
||||||
connection, null, depot.depotKey, proxyServer: cdnPool.ProxyServer).ConfigureAwait(false);
|
connection, depot.depotKey, cdnPool.ProxyServer).ConfigureAwait(false);
|
||||||
|
|
||||||
cdnPool.ReturnConnection(connection);
|
cdnPool.ReturnConnection(connection);
|
||||||
}
|
}
|
||||||
@@ -1223,13 +1223,13 @@ namespace DepotDownloader
|
|||||||
data.CompressedLength = chunk.CompressedLength;
|
data.CompressedLength = chunk.CompressedLength;
|
||||||
data.UncompressedLength = chunk.UncompressedLength;
|
data.UncompressedLength = chunk.UncompressedLength;
|
||||||
|
|
||||||
CDNClient.DepotChunk chunkData = null;
|
DepotChunk chunkData = null;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
cts.Token.ThrowIfCancellationRequested();
|
cts.Token.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
CDNClient.Server connection = null;
|
Server connection = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1237,7 +1237,7 @@ namespace DepotDownloader
|
|||||||
|
|
||||||
DebugLog.WriteLine("ContentDownloader", "Downloading chunk {0} from {1} with {2}", chunkID, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy");
|
DebugLog.WriteLine("ContentDownloader", "Downloading chunk {0} from {1} with {2}", chunkID, connection, cdnPool.ProxyServer != null ? cdnPool.ProxyServer : "no proxy");
|
||||||
chunkData = await cdnPool.CDNClient.DownloadDepotChunkAsync(depot.id, data,
|
chunkData = await cdnPool.CDNClient.DownloadDepotChunkAsync(depot.id, data,
|
||||||
connection, null, depot.depotKey, proxyServer: cdnPool.ProxyServer).ConfigureAwait(false);
|
connection, depot.depotKey, cdnPool.ProxyServer).ConfigureAwait(false);
|
||||||
|
|
||||||
cdnPool.ReturnConnection(connection);
|
cdnPool.ReturnConnection(connection);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net5.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
||||||
<RollForward>LatestMajor</RollForward>
|
<RollForward>LatestMajor</RollForward>
|
||||||
<Version>2.4.5</Version>
|
<Version>2.4.5</Version>
|
||||||
@@ -12,6 +12,6 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="protobuf-net" Version="3.0.101" />
|
<PackageReference Include="protobuf-net" Version="3.0.101" />
|
||||||
<PackageReference Include="SteamKit2" Version="2.4.0-Alpha.3" />
|
<PackageReference Include="SteamKit2" Version="2.4.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
@@ -40,6 +40,7 @@ namespace DepotDownloader
|
|||||||
|
|
||||||
public SteamClient steamClient;
|
public SteamClient steamClient;
|
||||||
public SteamUser steamUser;
|
public SteamUser steamUser;
|
||||||
|
public SteamContent steamContent;
|
||||||
readonly SteamApps steamApps;
|
readonly SteamApps steamApps;
|
||||||
readonly SteamCloud steamCloud;
|
readonly SteamCloud steamCloud;
|
||||||
readonly SteamUnifiedMessages.UnifiedService<IPublishedFile> steamPublishedFile;
|
readonly SteamUnifiedMessages.UnifiedService<IPublishedFile> steamPublishedFile;
|
||||||
@@ -101,6 +102,7 @@ namespace DepotDownloader
|
|||||||
this.steamCloud = this.steamClient.GetHandler<SteamCloud>();
|
this.steamCloud = this.steamClient.GetHandler<SteamCloud>();
|
||||||
var steamUnifiedMessages = this.steamClient.GetHandler<SteamUnifiedMessages>();
|
var steamUnifiedMessages = this.steamClient.GetHandler<SteamUnifiedMessages>();
|
||||||
this.steamPublishedFile = steamUnifiedMessages.CreateService<IPublishedFile>();
|
this.steamPublishedFile = steamUnifiedMessages.CreateService<IPublishedFile>();
|
||||||
|
this.steamContent = this.steamClient.GetHandler<SteamContent>();
|
||||||
|
|
||||||
this.callbacks = new CallbackManager(this.steamClient);
|
this.callbacks = new CallbackManager(this.steamClient);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
DepotDownloader
|
DepotDownloader
|
||||||
===============
|
===============
|
||||||
|
|
||||||
Steam depot downloader utilizing the SteamKit2 library. Supports .NET 5.0
|
Steam depot downloader utilizing the SteamKit2 library. Supports .NET 6.0
|
||||||
|
|
||||||
### Downloading one or all depots for an app
|
### Downloading one or all depots for an app
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in new issue
Block a user