Skip to content

Commit 63eec70

Browse files
committed
(#1341) Add early break in the thumbnail strategies process
1 parent 723357c commit 63eec70

File tree

7 files changed

+41
-24
lines changed

7 files changed

+41
-24
lines changed

src/Infra/Lanceur.Infra.Win32/Services/ThumbnailService.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,11 @@ async Task RunStrategy(AliasQueryResult alias)
8989
{
9090
foreach (var strategy in _orderedThumbnailStrategies)
9191
{
92-
try { await strategy.UpdateThumbnailAsync(alias, _cts.Token); }
92+
try
93+
{
94+
var isResolved = await strategy.UpdateThumbnailAsync(alias, _cts.Token);
95+
if (isResolved) { break; }
96+
}
9397
catch (OperationCanceledException ex)
9498
{
9599
_logger.LogDebug(ex, "Cancellation requested during thumbnail update of {AliasName}", alias.Name);

src/Infra/Lanceur.Infra.Win32/Thumbnails/IThumbnailStrategy.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ public interface IThumbnailStrategy
2323

2424
/// <summary>
2525
/// Updates the thumbnail associated with the specified alias.
26-
/// If the thumbnail is already cached, the update may be skipped.
2726
/// </summary>
2827
/// <param name="alias">The alias whose thumbnail needs to be updated.</param>
2928
/// <param name="cancellationToken">A token to cancel the asynchronous operation.</param>
30-
Task UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken cancellationToken);
29+
/// <returns>
30+
/// <c>true</c> if the thumbnail was resolved (already cached or successfully fetched),
31+
/// allowing the caller to skip remaining strategies; <c>false</c> if this strategy
32+
/// could not resolve the thumbnail and the next strategy should be tried.
33+
/// </returns>
34+
Task<bool> UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken cancellationToken);
3135

3236
#endregion
3337
}

src/Infra/Lanceur.Infra.Win32/Thumbnails/Strategies/FavIconAppThumbnailStrategy.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@ IAliasManagementService aliasManagementService
3333

3434
#region Methods
3535

36-
protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
36+
/// <inheritdoc/>
37+
protected override async Task<bool> UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
3738
{
3839
var thumbnail = await _favIconService.UpdateFaviconAsync(
3940
alias,
4041
_ => alias.ResolveThumbnailAbsolutePath(),
4142
cancellationToken
4243
);
43-
if (thumbnail.IsNullOrEmpty()) { return; }
44+
if (thumbnail.IsNullOrEmpty()) { return false; }
4445

4546
_logger.LogInformation(
4647
"Updating for alias {Alias} favicon from {Thumbnail} to {FavIconPath}",
@@ -51,6 +52,7 @@ protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, C
5152

5253
alias.Thumbnail = thumbnail;
5354
_aliasManagementService.UpdateThumbnail(alias);
55+
return true;
5456
}
5557

5658
#endregion

src/Infra/Lanceur.Infra.Win32/Thumbnails/Strategies/PackagedAppThumbnailStrategy.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,25 @@ ILogger<PackagedAppThumbnailStrategy> logger
4040

4141
#region Methods
4242

43-
protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
43+
/// <inheritdoc/>
44+
protected override async Task<bool> UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
4445
{
45-
if (!alias.IsPackagedApplication()) { return; }
46+
if (!alias.IsPackagedApplication()) { return false; }
4647

4748
var app = await _packagedAppSearchService.GetByInstalledDirectoryAsync(alias.FileName!);
4849
var response = app.FirstOrDefault();
4950

5051
if (response is null)
5152
{
5253
_logger.LogTrace("Failed to download the thumbnail for alias {Name}.", alias.Name);
53-
return;
54+
return true;
5455
}
5556

5657
var thumbnailAbsolutePath = alias.ResolveThumbnailAbsolutePath();
5758
response.Logo.LocalPath.CopyToImageRepository(thumbnailAbsolutePath);
5859
alias.Thumbnail = thumbnailAbsolutePath;
5960
_aliasManagementService.UpdateThumbnail(alias);
61+
return true;
6062
}
6163

6264
#endregion

src/Infra/Lanceur.Infra.Win32/Thumbnails/Strategies/SteamLibraryAppThumbnailStrategy.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ private async Task<bool> SaveThumbnailAsync(HttpResponseMessage response, string
7272
}
7373

7474
/// <inheritdoc />
75-
protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
75+
protected override async Task<bool> UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
7676
{
77-
if (!alias.IsSteamGame()) { return; }
77+
if (!alias.IsSteamGame()) { return false; }
7878

7979
var url = GetThumbnailUrl(alias.GetSteamId());
8080
using var response =
@@ -86,16 +86,16 @@ protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, C
8686
url
8787
);
8888

89-
if (response.StatusCode != HttpStatusCode.OK) { return; }
89+
if (response.StatusCode != HttpStatusCode.OK) { return true; }
9090

9191
var thumbnail = alias.ResolveThumbnailAbsolutePath();
9292

93-
if (!File.Exists(thumbnail) && !await SaveThumbnailAsync(response, thumbnail)) { return; }
93+
if (!File.Exists(thumbnail) && !await SaveThumbnailAsync(response, thumbnail)) { return true; }
9494

9595
alias.Thumbnail = thumbnail;
9696
_aliasManagementService.UpdateThumbnail(alias);
9797

98-
return;
98+
return true;
9999

100100
string GetThumbnailUrl(int appId) =>
101101
$"https://cdn.akamai.steamstatic.com/steam/apps/{appId}/capsule_sm_120.jpg";

src/Infra/Lanceur.Infra.Win32/Thumbnails/Strategies/Win32AppThumbnailStrategy.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,23 @@ ILogger<Win32AppThumbnailStrategy> logger
4444

4545
#region Methods
4646

47-
protected override async Task UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
47+
/// <inheritdoc/>
48+
protected override async Task<bool> UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken)
4849
{
4950
var imageSource = await _staThreadRunner.RunAsync(
5051
() => _win32ThumbnailService.GetThumbnail(alias.FileName!),
5152
cancellationToken
5253
);
5354
if (imageSource is null)
5455
{
55-
_logger.LogTrace("Failed to download the thumbnail for alias {Name}.", alias.Name);
56-
return;
56+
_logger.LogTrace("Failed to fetch the thumbnail in disk for alias {Name}.", alias.Name);
57+
return false;
5758
}
5859

5960
alias.Thumbnail = alias.ResolveThumbnailAbsolutePath();
6061
imageSource.CopyToImageRepository(alias.Thumbnail);
6162
_aliasManagementService.UpdateThumbnail(alias);
63+
return true;
6264
}
6365

6466
#endregion

src/Infra/Lanceur.Infra.Win32/Thumbnails/ThumbnailStrategy.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,15 @@ public abstract class ThumbnailStrategy : IThumbnailStrategy
3838
/// </remarks>
3939
/// <param name="alias">The alias for which to update the thumbnail.</param>
4040
/// <param name="cancellationToken">Token to cancel the operation.</param>
41-
protected abstract Task UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken);
41+
/// <returns>
42+
/// <c>true</c> if the thumbnail was resolved (already cached or successfully fetched),
43+
/// allowing the caller to skip remaining strategies; <c>false</c> if this strategy
44+
/// could not resolve the thumbnail and the next strategy should be tried.
45+
/// </returns>
46+
protected abstract Task<bool> UpdateThumbnailCoreAsync(AliasQueryResult alias, CancellationToken cancellationToken);
4247

4348
/// <inheritdoc />
44-
public async Task UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken cancellationToken)
49+
public async Task<bool> UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken cancellationToken)
4550
{
4651
_logger.LogTrace("Executing thumbnail strategy {Strategy} for alias {Alias}",
4752
GetType().FullName,
@@ -55,7 +60,7 @@ public async Task UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken
5560
alias.Name,
5661
alias.Thumbnail
5762
);
58-
return;
63+
return true;
5964
}
6065

6166
if (ResolveCachePathExists(out var path))
@@ -66,18 +71,16 @@ public async Task UpdateThumbnailAsync(AliasQueryResult alias, CancellationToken
6671
path
6772
);
6873
alias.Thumbnail ??= path;
69-
return;
74+
return true;
7075
}
7176

7277
if (alias.FileName is null)
7378
{
7479
_logger.LogInformation("Alias {Alias} does not have a file name.", alias.Name);
75-
return;
80+
return true;
7681
}
7782

78-
await UpdateThumbnailCoreAsync(alias, cancellationToken);
79-
80-
return;
83+
return await UpdateThumbnailCoreAsync(alias, cancellationToken);
8184

8285
bool ResolveCachePathExists(out string path)
8386
{

0 commit comments

Comments
 (0)