Skip to content

Commit 6e4a6ce

Browse files
committed
Update package references and improve AudioTagModel handling
- Updated Microsoft.AspNetCore packages to version 9.0.10 across multiple projects. - Updated Newtonsoft.Json to version 13.0.4 in various projects. - Updated Swashbuckle.AspNetCore packages to version 9.0.6 in NoMercy.Api and NoMercy.Server. - Updated FFMpegCore to version 5.3.0 in NoMercy.Encoder, NoMercy.NmSystem, and NoMercy.Server. - Updated H.NotifyIcon to version 2.3.2 in NoMercy.Server and NoMercy.Setup. - Updated Microsoft.EntityFrameworkCore packages to version 9.0.10 in NoMercy.Database and NoMercy.Queue. - Updated xunit and related packages to the latest versions in test projects. - Added RecordingId property to AudioTagModel and improved parsing logic for MusicBrainz data. - Enhanced AudioImportJob to utilize new MusicBrainzRecordingClient methods for better data retrieval.
1 parent d25df1c commit 6e4a6ce

File tree

24 files changed

+195
-82
lines changed

24 files changed

+195
-82
lines changed

src/NoMercy.Api/NoMercy.Api.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@
1515
<PackageReference Include="Asp.Versioning.Mvc" Version="8.1.0"/>
1616
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0"/>
1717
<PackageReference Include="Castle.Core" Version="5.2.1"/>
18-
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.8" />
19-
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.8" />
20-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.8" />
21-
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.8" />
18+
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.10" />
19+
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.10" />
20+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.10" />
21+
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.10" />
2222
<PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.14.0" />
2323
<PackageReference Include="MimeMapping" Version="3.1.0"/>
24-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
25-
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="9.0.4" />
26-
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="9.0.4" />
27-
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.4" />
24+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
25+
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="9.0.6" />
26+
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="9.0.6" />
27+
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.6" />
2828
<PackageReference Include="System.Net.WebSockets" Version="4.3.0"/>
2929
<PackageReference Include="Ulid" Version="1.4.1" />
3030
<PackageReference Include="xunit" Version="2.9.3"/>
3131
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0"/>
32-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8" />
32+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.10" />
3333
</ItemGroup>
3434

3535
<ItemGroup>

src/NoMercy.App/NoMercy.App.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
</PropertyGroup>
4444

4545
<ItemGroup>
46-
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.8" />
46+
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.10" />
4747
<PackageReference Include="Photino.NET" Version="4.0.16"/>
4848
<PackageReference Include="Photino.NET.Server" Version="4.0.12"/>
4949
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />

src/NoMercy.Data/NoMercy.Data.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
2727
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.14.0" />
2828
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.14.0" />
29-
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.8">
29+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.10">
3030
<PrivateAssets>all</PrivateAssets>
3131
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3232
</PackageReference>
3333
<PackageReference Include="Moq" Version="4.20.72"/>
34-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
34+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
3535
<PackageReference Include="xunit" Version="2.9.3"/>
3636
</ItemGroup>
3737

src/NoMercy.Data/Repositories/LibraryRepository.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ public IQueryable<Tv> GetLibraryShows(Guid userId, Ulid libraryId, string langua
350350
.Any(videoFile => videoFile.Folder != null) == true
351351
) == true)
352352
.Include(tv => tv.Episodes
353-
.Where(episode => episode.SeasonNumber > 0 && episode.VideoFiles.Count != 0)
353+
.Where(episode => episode.SeasonNumber > 0)
354354
)
355355
.ThenInclude(episode => episode.VideoFiles)
356356
.Include(tv => tv.Media
@@ -367,8 +367,7 @@ public IQueryable<Tv> GetLibraryShows(Guid userId, Ulid libraryId, string langua
367367
.Include(tv => tv.KeywordTvs)
368368
.ThenInclude(keywordTv => keywordTv.Keyword)
369369
.Include(tv => tv.CertificationTvs)
370-
.ThenInclude(certificationTv => certificationTv.Certification)
371-
.OrderBy(tv => tv.TitleSort);
370+
.ThenInclude(certificationTv => certificationTv.Certification);
372371

373372
if (orderByExpression is not null && direction == "desc")
374373
return x.OrderByDescending(orderByExpression)

src/NoMercy.Database/NoMercy.Database.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,22 @@
1818

1919
<ItemGroup>
2020
<PackageReference Include="Castle.Core" Version="5.2.1"/>
21-
<PackageReference Include="FlexLabs.EntityFrameworkCore.Upsert" Version="9.100.0" />
22-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.8" />
23-
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="9.0.8" />
24-
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.8">
21+
<PackageReference Include="FlexLabs.EntityFrameworkCore.Upsert" Version="9.100.1" />
22+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.10" />
23+
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="9.0.10" />
24+
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.10">
2525
<PrivateAssets>all</PrivateAssets>
2626
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2727
</PackageReference>
28-
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.8" />
29-
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.8" />
30-
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.8" />
31-
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.8">
28+
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.10" />
29+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.10" />
30+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.10" />
31+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.10">
3232
<PrivateAssets>all</PrivateAssets>
3333
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3434
</PackageReference>
3535
<PackageReference Include="Moq" Version="4.20.72"/>
36-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
36+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
3737
<PackageReference Include="Ulid" Version="1.4.1" />
3838
<PackageReference Include="xunit" Version="2.9.3"/>
3939
</ItemGroup>

src/NoMercy.Encoder/NoMercy.Encoder.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919

2020
<ItemGroup>
2121
<PackageReference Include="Castle.Core" Version="5.2.1"/>
22-
<PackageReference Include="FFMpegCore" Version="5.2.0"/>
22+
<PackageReference Include="FFMpegCore" Version="5.3.0" />
2323
<PackageReference Include="Moq" Version="4.20.72"/>
24-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
24+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
2525
<PackageReference Include="Ulid" Version="1.4.1" />
2626
<PackageReference Include="xunit" Version="2.9.3"/>
2727
</ItemGroup>

src/NoMercy.Helpers/NoMercy.Helpers.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
</PropertyGroup>
1818

1919
<ItemGroup>
20-
<PackageReference Include="BenchmarkDotNet" Version="0.15.2" />
20+
<PackageReference Include="BenchmarkDotNet" Version="0.15.4" />
2121
<PackageReference Include="Castle.Core" Version="5.2.1"/>
2222
<PackageReference Include="FFMpegCore.Extensions.System.Drawing.Common" Version="5.0.2" />
2323
<PackageReference Include="HeyRed.ImageSharp.Heif" Version="2.1.3"/>
2424
<PackageReference Include="LibHeif.Native" Version="1.15.1"/>
2525
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.5-pre437" />
2626
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.3.0"/>
27-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
27+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
2828
<PackageReference Include="SecureStore" Version="1.2.2"/>
2929
<PackageReference Include="Serilog.Expressions" Version="5.1.0-dev-02301" />
3030
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0"/>

src/NoMercy.MediaProcessing/Jobs/Dto/AudioTagModel.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class MusicBrainz
1414
public Guid ReleaseArtistId { get; set; }
1515
public Guid ArtistId { get; set; }
1616
public Guid ReleaseTrackId { get; set; }
17+
public Guid RecordingId { get; set; }
1718
public string FingerPrint { get; set; } = string.Empty;
1819
public Guid AcoustIdId { get; set; }
1920
}
@@ -36,17 +37,20 @@ public static async Task<AudioTagModel> Create(MediaFile fileItem)
3637
{
3738
mb ??= new();
3839

39-
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzReleaseId, out Guid rid))
40-
mb.ReleaseId = rid;
40+
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzReleaseId, out Guid rId))
41+
mb.ReleaseId = rId;
4142

42-
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzArtistId, out Guid aid))
43-
mb.ArtistId = aid;
43+
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzArtistId, out Guid aId))
44+
mb.ArtistId = aId;
4445

45-
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzReleaseArtistId, out Guid raid))
46-
mb.ReleaseArtistId = raid;
46+
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzReleaseArtistId, out Guid raId))
47+
mb.ReleaseArtistId = raId;
4748

48-
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzTrackId, out Guid tid))
49-
mb.ReleaseTrackId = tid;
49+
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzTrackId, out Guid tId))
50+
mb.ReleaseTrackId = tId;
51+
52+
if (Guid.TryParse(fileItem.TagFile.Tag.MusicBrainzTrackId, out Guid recId))
53+
mb.RecordingId = recId;
5054

5155
if (tagsContainer.TryGetValue("Acoustid Fingerprint", out string? fingerPrint))
5256
mb.FingerPrint = fingerPrint;
@@ -65,6 +69,12 @@ public static async Task<AudioTagModel> Create(MediaFile fileItem)
6569

6670
if (mb.ReleaseTrackId == Guid.Empty && tagsContainer.TryGetValue("MusicBrainz Track Id", out string? trackId))
6771
mb.ReleaseTrackId = Guid.Parse(trackId);
72+
73+
if (mb.ReleaseTrackId == Guid.Empty && tagsContainer.TryGetValue("MusicBrainz Recording Id", out string? recordingId))
74+
mb.RecordingId = Guid.Parse(recordingId);
75+
76+
if (mb.ReleaseTrackId == Guid.Empty && tagsContainer.TryGetValue("MusicBrainz Track Id", out string? trackId2))
77+
mb.RecordingId = Guid.Parse(trackId2);
6878
}
6979
else
7080
{
@@ -87,6 +97,12 @@ public static async Task<AudioTagModel> Create(MediaFile fileItem)
8797
if (tagsContainer.TryGetValue("MusicBrainz Track Id", out string? trackId))
8898
mb.ReleaseTrackId = Guid.Parse(trackId);
8999

100+
if (tagsContainer.TryGetValue("MusicBrainz Recording Id", out string? recordingId))
101+
mb.RecordingId = Guid.Parse(recordingId);
102+
103+
if (tagsContainer.TryGetValue("MusicBrainz Track Id", out string? trackId2))
104+
mb.RecordingId = Guid.Parse(trackId2);
105+
90106
}
91107

92108
AudioTagModel metaData = new()

src/NoMercy.MediaProcessing/Jobs/MediaJobs/AudioImportJob.cs

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
using System.Collections.Concurrent;
2+
using Newtonsoft.Json;
23
using NoMercy.Database;
3-
using NoMercy.MediaProcessing.Files;
44
using NoMercy.MediaProcessing.Jobs.Dto;
55
using NoMercy.NmSystem;
66
using NoMercy.NmSystem.Dto;
7+
using NoMercy.NmSystem.Extensions;
78
using NoMercy.NmSystem.SystemCalls;
89
using NoMercy.Providers.MusicBrainz.Client;
910
using NoMercy.Providers.MusicBrainz.Models;
@@ -23,26 +24,75 @@ public override async Task Handle()
2324
await using MediaContext context = new();
2425

2526
using MusicBrainzReleaseClient musicBrainzReleaseClient = new();
27+
using MusicBrainzRecordingClient musicBrainzRecordingClient = new();
28+
using MusicBrainzArtistClient musicBrainzArtistClient = new();
2629

2730
_files = await GetFiles();
2831

2932
Dictionary<Guid, List<AudioTagModel>> tags = await GetTags();
33+
34+
MusicBrainzReleaseAppends? release = null;
35+
List<MusicBrainzArtistAppends> releaseArtists = [];
36+
List<(MusicBrainzRecordingAppends, MusicBrainzArtistAppends[], MediaFile)> fileLinksToTrack = [];
3037

3138
KeyValuePair<Guid, List<AudioTagModel>> firstRelease = tags
3239
.OrderByDescending(x => x.Value.Count)
3340
.FirstOrDefault();
3441

3542
if (firstRelease.Key != Guid.Empty)
3643
{
37-
MusicBrainzReleaseAppends? result = await musicBrainzReleaseClient.WithAllAppends(firstRelease.Key);
38-
if (result == null)
44+
// Release
45+
release = await musicBrainzReleaseClient.WithAllAppends(firstRelease.Key);
46+
if (release == null)
3947
{
40-
Logger.Queue($"MusicBrainz release {firstRelease.Key} not found.");
41-
// do something else
48+
// check fingerprint or acoustid?
4249
return;
4350
}
4451

45-
Logger.Queue(firstRelease.Value);
52+
// Release Artists
53+
foreach (ReleaseArtistCredit musicBrainzArtistCredit in release.ArtistCredit)
54+
{
55+
MusicBrainzArtistAppends? artist = await musicBrainzArtistClient.WithAllAppends(musicBrainzArtistCredit.MusicBrainzArtist.Id);
56+
if (artist == null) continue;
57+
releaseArtists.Add(artist);
58+
}
59+
60+
// Tracks
61+
List<MusicBrainzTrack> allTracks = release.Media.SelectMany(x => x.Tracks).ToList();
62+
List<string> checkedFiles = [];
63+
foreach (MusicBrainzTrack track in allTracks)
64+
{
65+
foreach (AudioTagModel audioTagModel in firstRelease.Value)
66+
{
67+
if (audioTagModel.musicBrainz == null || audioTagModel.tags == null || checkedFiles.Contains(audioTagModel.fileItem.Path)) continue;
68+
if ((audioTagModel.musicBrainz.RecordingId != track.Recording.Id &&
69+
audioTagModel.musicBrainz.RecordingId != track.Id &&
70+
audioTagModel.musicBrainz.ReleaseTrackId != track.Recording.Id &&
71+
audioTagModel.musicBrainz.ReleaseTrackId != track.Id) &&
72+
(!audioTagModel.tags.Title.ContainsSanitized(track.Title) ||
73+
(audioTagModel.tags.Track != track.Position &&
74+
!(Math.Abs(float.Parse(audioTagModel.format?.Duration ?? "0") * 1000 - track.Length ??
75+
0) < 5)))) continue;
76+
// Recording
77+
MusicBrainzRecordingAppends? recording = await musicBrainzRecordingClient.WithAllAppends(track.Recording.Id);
78+
if (recording == null) continue;
79+
80+
// Recording Artists
81+
List<MusicBrainzArtistAppends> artists = [];
82+
foreach (MusicBrainzArtistCredit musicBrainzArtistCredit in recording.ArtistCredit)
83+
{
84+
MusicBrainzArtistAppends? subArtist = await musicBrainzArtistClient.WithAllAppends(musicBrainzArtistCredit.MusicBrainzArtist.Id);
85+
if (subArtist == null) continue;
86+
artists.Add(subArtist);
87+
}
88+
89+
// Link file to track
90+
checkedFiles.Add(audioTagModel.fileItem.Path);
91+
fileLinksToTrack.Add((recording, artists.ToArray(), audioTagModel.fileItem));
92+
break;
93+
}
94+
}
95+
await File.WriteAllTextAsync(@"C:\test.json", JsonConvert.SerializeObject(((release, releaseArtists), fileLinksToTrack), Formatting.Indented));
4696
}
4797
}
4898

src/NoMercy.MediaProcessing/NoMercy.MediaProcessing.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
<ItemGroup>
2323
<PackageReference Include="Castle.Core" Version="5.2.1"/>
24-
<PackageReference Include="Newtonsoft.Json" Version="13.0.4-beta1" />
24+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
2525
<PackageReference Include="SubtitlesParserV2" Version="2.3.0" />
2626
<PackageReference Include="TagLibSharp" Version="2.3.0"/>
2727
</ItemGroup>

0 commit comments

Comments
 (0)