Skip to content

Commit 931853c

Browse files
authored
Merge pull request #73 from melodee-project/sph.2026-05-25.01
v2.1.3
2 parents f4b8d62 + 257fa49 commit 931853c

144 files changed

Lines changed: 12353 additions & 2286 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/docker/Dockerfile.container-scan

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
FROM mcr.microsoft.com/dotnet/aspnet:10.0.4
1+
ARG DOTNET_ASPNET_IMAGE=mcr.microsoft.com/dotnet/aspnet:10.0
2+
FROM ${DOTNET_ASPNET_IMAGE}
23

34
WORKDIR /app
45

.github/workflows/dotnet.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ jobs:
7474
Jwt__Audience: "test"
7575
security__secretKey: "testsecretkeytestsecretkeytestsecretkey"
7676
QuartzDisabled: "true"
77-
run: dotnet test --no-build --verbosity normal --collect:"XPlat Code Coverage" --settings coverage.runsettings --results-directory coverage/results
77+
# Parallel solution-level VSTest with coverage can return a non-zero exit after successful test summaries.
78+
run: dotnet test --no-build -m:1 --verbosity normal --collect:"XPlat Code Coverage" --settings coverage.runsettings --results-directory coverage/results
7879
- name: Generate coverage report
7980
run: |
8081
dotnet tool install -g dotnet-reportgenerator-globaltool

.github/workflows/sca-container-scan.yml

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ jobs:
4545
permissions:
4646
contents: read
4747
security-events: write
48+
env:
49+
SCAN_BASE_IMAGE: mcr.microsoft.com/dotnet/aspnet:10.0
4850

4951
steps:
5052
- name: Checkout repository
@@ -58,18 +60,47 @@ jobs:
5860
- name: Publish application for scanning
5961
run: dotnet publish src/Melodee.Blazor/Melodee.Blazor.csproj -c Release -o scan/publish --self-contained false -p:PublishTrimmed=false
6062

61-
- name: Set up Docker Buildx
62-
uses: docker/setup-buildx-action@v3
63+
- name: Pull Docker base image for scanning
64+
run: |
65+
set -euo pipefail
66+
67+
for attempt in 1 2 3 4 5; do
68+
if docker pull "$SCAN_BASE_IMAGE"; then
69+
exit 0
70+
fi
71+
72+
delay=$((attempt * 20))
73+
echo "Base image pull failed on attempt ${attempt}; retrying in ${delay}s..."
74+
sleep "$delay"
75+
done
76+
77+
docker pull "$SCAN_BASE_IMAGE"
6378
6479
- name: Build Docker image for scanning
65-
uses: docker/build-push-action@v5
66-
with:
67-
context: .
68-
file: .github/docker/Dockerfile.container-scan
69-
load: true
70-
tags: melodee:latest
71-
cache-from: type=gha
72-
cache-to: type=gha,mode=max
80+
run: |
81+
set -euo pipefail
82+
83+
for attempt in 1 2 3; do
84+
if docker build \
85+
--pull=false \
86+
--build-arg DOTNET_ASPNET_IMAGE="$SCAN_BASE_IMAGE" \
87+
-f .github/docker/Dockerfile.container-scan \
88+
-t melodee:latest \
89+
.; then
90+
exit 0
91+
fi
92+
93+
delay=$((attempt * 20))
94+
echo "Docker image build failed on attempt ${attempt}; retrying in ${delay}s..."
95+
sleep "$delay"
96+
done
97+
98+
docker build \
99+
--pull=false \
100+
--build-arg DOTNET_ASPNET_IMAGE="$SCAN_BASE_IMAGE" \
101+
-f .github/docker/Dockerfile.container-scan \
102+
-t melodee:latest \
103+
.
73104
74105
- name: Run Trivy Vulnerability Scanner
75106
uses: aquasecurity/trivy-action@master

Directory.Build.props

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
<Project>
22
<PropertyGroup>
33
<AllowMissingPrunePackageData>true</AllowMissingPrunePackageData>
4-
<!-- Suppress NU1902 for SixLabors.ImageSharp (v3.1.10) which is a transitive dependency of IdSharp.Tagging.
5-
Melodee no longer directly references or uses ImageSharp; all image processing is done via SkiaSharp.
6-
This warning cannot be resolved without upgrading or replacing IdSharp.Tagging. -->
7-
<NoWarn>$(NoWarn);NU1902</NoWarn>
84
</PropertyGroup>
95
</Project>

Directory.Packages.props

Lines changed: 49 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
<PackageVersion Include="Asp.Versioning.Http" Version="10.0.0" />
88
<PackageVersion Include="Asp.Versioning.Mvc" Version="10.0.0" />
99
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="10.0.0" />
10-
<PackageVersion Include="AuralizeBlazor" Version="3.0.4" />
1110
<PackageVersion Include="BCrypt.Net-Next" Version="4.2.0" />
1211
<PackageVersion Include="Blazored.SessionStorage" Version="2.4.0" />
1312
<PackageVersion Include="bunit" Version="2.7.2" />
@@ -18,106 +17,106 @@
1817
<PackageVersion Include="Crc32.NET" Version="1.2.0" />
1918
<PackageVersion Include="CsvHelper" Version="33.1.0" />
2019
<PackageVersion Include="Dapper" Version="2.1.79" />
21-
<PackageVersion Include="DecentDB.EntityFrameworkCore" Version="2.7.0" />
22-
<PackageVersion Include="DecentDB.EntityFrameworkCore.NodaTime" Version="2.7.0" />
20+
<PackageVersion Include="DecentDB.AdoNet" Version="2.13.1" />
21+
<PackageVersion Include="DecentDB.EntityFrameworkCore" Version="2.13.1" />
22+
<PackageVersion Include="DecentDB.EntityFrameworkCore.NodaTime" Version="2.13.1" />
2323
<PackageVersion Include="Fastenshtein" Version="1.0.12" />
2424
<PackageVersion Include="FFMpegCore" Version="5.4.0" />
2525
<PackageVersion Include="FluentAssertions" Version="8.10.0" />
2626
<PackageVersion Include="FluentValidation" Version="12.1.1" />
27-
<PackageVersion Include="Google.Apis.Auth" Version="1.74.0" />
27+
<PackageVersion Include="Google.Apis.Auth" Version="1.75.0" />
2828
<PackageVersion Include="Hashids.net" Version="1.7.0" />
2929
<PackageVersion Include="Hqub.Last.fm" Version="2.5.1" />
3030
<PackageVersion Include="HtmlAgilityPack" Version="1.12.4" />
3131
<PackageVersion Include="HtmlSanitizer" Version="9.1.923-beta" />
3232
<PackageVersion Include="IdGen" Version="3.0.7" />
33-
<PackageVersion Include="IdSharp.Common" Version="2.0.3" />
34-
<PackageVersion Include="IdSharp.Tagging" Version="2.0.3" />
3533
<PackageVersion Include="JetBrains.Annotations" Version="2025.2.4" />
36-
<PackageVersion Include="Jint" Version="4.9.2" />
34+
<PackageVersion Include="Jint" Version="4.10.0" />
3735
<PackageVersion Include="K4os.Hash.xxHash" Version="1.0.8" />
3836
<PackageVersion Include="LiteDB" Version="5.0.21" />
39-
<PackageVersion Include="Mapster" Version="10.0.7" />
40-
<PackageVersion Include="Markdig" Version="1.2.0" />
41-
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.8" />
42-
<PackageVersion Include="Microsoft.AspNetCore.Components.Authorization" Version="10.0.8" />
43-
<PackageVersion Include="Microsoft.AspNetCore.Http" Version="2.3.10" />
44-
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.10" />
45-
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.8" />
46-
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.8" />
47-
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.8" />
48-
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="10.0.8" />
49-
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.8" />
50-
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.8">
37+
<PackageVersion Include="Mapster" Version="10.0.8" />
38+
<PackageVersion Include="Markdig" Version="1.3.0" />
39+
<PackageVersion Include="MessagePack" Version="3.1.7" />
40+
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.9" />
41+
<PackageVersion Include="Microsoft.AspNetCore.Components.Authorization" Version="10.0.9" />
42+
<PackageVersion Include="Microsoft.AspNetCore.Http" Version="2.3.11" />
43+
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.11" />
44+
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.9" />
45+
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.9" />
46+
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.9" />
47+
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="10.0.9" />
48+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.9" />
49+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.9">
5150
<PrivateAssets>all</PrivateAssets>
5251
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5352
</PackageVersion>
54-
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.8" />
53+
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.9" />
5554
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.7">
5655
<PrivateAssets>all</PrivateAssets>
5756
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5857
</PackageVersion>
59-
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.8" />
60-
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.8" />
61-
<PackageVersion Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.8" />
62-
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.8" />
63-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.8" />
64-
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.8" />
65-
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.8" />
66-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.8" />
67-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" />
68-
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.18.0" />
69-
<PackageVersion Include="Microsoft.Net.Http.Headers" Version="10.0.8" />
70-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
71-
<PackageVersion Include="MailKit" Version="4.16.0" />
72-
<PackageVersion Include="MimeKit" Version="4.16.0" />
58+
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.9" />
59+
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.9" />
60+
<PackageVersion Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.9" />
61+
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.9" />
62+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.9" />
63+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.9" />
64+
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.9" />
65+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.9" />
66+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.9" />
67+
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.19.1" />
68+
<PackageVersion Include="Microsoft.Net.Http.Headers" Version="10.0.9" />
69+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
70+
<PackageVersion Include="MailKit" Version="4.17.0" />
71+
<PackageVersion Include="MimeKit" Version="4.17.0" />
7372
<PackageVersion Include="Moq" Version="4.20.72" />
7473
<PackageVersion Include="NBomber" Version="6.4.1" />
7574
<PackageVersion Include="NodaTime" Version="3.3.2" />
7675
<PackageVersion Include="NodaTime.Testing" Version="3.3.2" />
77-
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.1" />
78-
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="10.0.1" />
76+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.2" />
77+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="10.0.2" />
7978
<PackageVersion Include="PSC.Blazor.Components.MarkdownEditor" Version="10.0.9" />
80-
<PackageVersion Include="Polly" Version="8.6.6" />
81-
<PackageVersion Include="Polly.Core" Version="8.6.6" />
79+
<PackageVersion Include="Polly" Version="8.7.0" />
80+
<PackageVersion Include="Polly.Core" Version="8.7.0" />
8281
<PackageVersion Include="Quartz.AspNetCore" Version="3.18.1" />
8382
<PackageVersion Include="Quartz.Extensions.DependencyInjection" Version="3.18.1" />
8483
<PackageVersion Include="Quartz.Jobs" Version="3.18.1" />
8584
<PackageVersion Include="Quartz.Plugins.TimeZoneConverter" Version="3.18.1" />
8685
<PackageVersion Include="Quartz.Serialization.SystemTextJson" Version="3.18.1" />
87-
<PackageVersion Include="Radzen.Blazor" Version="10.4.4" />
86+
<PackageVersion Include="Radzen.Blazor" Version="10.4.9" />
8887
<PackageVersion Include="Rebus" Version="8.9.2" />
8988
<PackageVersion Include="Rebus.ServiceProvider" Version="10.7.2" />
90-
<PackageVersion Include="Scalar.AspNetCore" Version="2.14.14" />
89+
<PackageVersion Include="Scalar.AspNetCore" Version="2.16.3" />
9190
<PackageVersion Include="Serilog" Version="4.3.1" />
9291
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
9392
<PackageVersion Include="Serilog.Formatting.Compact" Version="3.0.0" />
9493
<PackageVersion Include="Serilog.Settings.AppSettings" Version="3.0.0" />
95-
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
94+
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.1" />
9695
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
9796
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
9897
<PackageVersion Include="SerilogTimings" Version="3.1.0" />
9998
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
100-
<PackageVersion Include="SkiaSharp" Version="3.119.2" />
99+
<PackageVersion Include="SkiaSharp" Version="3.119.4" />
101100
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.119.2" />
102101
<PackageVersion Include="SmartFormat" Version="3.6.1" />
103-
<PackageVersion Include="Spectre.Console" Version="0.55.2" />
102+
<PackageVersion Include="Spectre.Console" Version="0.57.0" />
104103
<PackageVersion Include="Spectre.Console.Cli" Version="0.55.0" />
105-
<PackageVersion Include="Spectre.Console.Json" Version="0.55.2" />
106-
<PackageVersion Include="Spectre.Console.Testing" Version="0.55.2" />
104+
<PackageVersion Include="Spectre.Console.Json" Version="0.57.0" />
105+
<PackageVersion Include="Spectre.Console.Testing" Version="0.57.0" />
107106
<PackageVersion Include="SpotifyAPI.Web" Version="7.4.2" />
108107
<PackageVersion Include="Sqids" Version="3.2.1" />
109-
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.18.0" />
110-
<PackageVersion Include="System.IO.Hashing" Version="10.0.8" />
108+
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.19.1" />
109+
<PackageVersion Include="System.IO.Hashing" Version="10.0.9" />
111110
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.7.2" />
112111
<PackageVersion Include="System.Reactive" Version="6.1.0" />
113112
<PackageVersion Include="System.Resources.Extensions" Version="10.0.7" />
114-
<PackageVersion Include="System.ServiceModel.Syndication" Version="10.0.8" />
113+
<PackageVersion Include="System.ServiceModel.Syndication" Version="10.0.9" />
115114
<PackageVersion Include="xunit" Version="2.9.3" />
116115
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5">
117116
<PrivateAssets>all</PrivateAssets>
118117
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
119118
</PackageVersion>
120-
<PackageVersion Include="z440.atl.core" Version="7.13.0" />
119+
<PackageVersion Include="z440.atl.core" Version="7.15.3" />
121120
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />
122121
</ItemGroup>
123-
</Project>
122+
</Project>

benchmarks/Melodee.Benchmarks/Melodee.Benchmarks.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515

1616
<ItemGroup>
1717
<PackageReference Include="BenchmarkDotNet" />
18+
<PackageReference Include="DecentDB.AdoNet" />
1819
<PackageReference Include="NBomber" />
20+
<PackageReference Include="MessagePack">
21+
<PrivateAssets>all</PrivateAssets>
22+
</PackageReference>
1923
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" />
2024
<PackageReference Include="FluentAssertions" />
2125
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />

benchmarks/Melodee.Benchmarks/MusicBrainzImportBenchmarks.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,15 @@ public async Task<int> ImportWithDefaultSettings()
8181
await context.Database.EnsureCreatedAsync();
8282

8383
var importer = new DecentDBStreamingMusicBrainzImporter(_logger);
84-
await importer.ImportAsync(context, _testDataPath, null, CancellationToken.None);
85-
86-
var count = await context.Artists.CountAsync();
84+
var summary = await importer.ImportAsync(context, _testDataPath, null, CancellationToken.None);
8785

8886
try
8987
{
9088
File.Delete(dbFile);
9189
}
9290
catch { }
9391

94-
return count;
92+
return summary.Artists;
9593
}
9694

9795
[Benchmark]
@@ -107,17 +105,15 @@ public async Task<int> ImportWithLargerDataset()
107105
await context.Database.EnsureCreatedAsync();
108106

109107
var importer = new DecentDBStreamingMusicBrainzImporter(_logger);
110-
await importer.ImportAsync(context, _testDataPath, null, CancellationToken.None);
111-
112-
var count = await context.Artists.CountAsync();
108+
var summary = await importer.ImportAsync(context, _testDataPath, null, CancellationToken.None);
113109

114110
try
115111
{
116112
File.Delete(dbFile);
117113
}
118114
catch { }
119115

120-
return count;
116+
return summary.Artists;
121117
}
122118

123119
[Benchmark]
@@ -133,18 +129,16 @@ public async Task<int> ImportWithProgressTracking()
133129
await context.Database.EnsureCreatedAsync();
134130

135131
var importer = new DecentDBStreamingMusicBrainzImporter(_logger);
136-
await importer.ImportAsync(context, _testDataPath,
132+
var summary = await importer.ImportAsync(context, _testDataPath,
137133
(phase, current, total, msg) => { }, CancellationToken.None);
138134

139-
var count = await context.Artists.CountAsync();
140-
141135
try
142136
{
143137
File.Delete(dbFile);
144138
}
145139
catch { }
146140

147-
return count;
141+
return summary.Artists;
148142
}
149143
}
150144

0 commit comments

Comments
 (0)