diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs
index 21a15c58ca..0a8c6f4b25 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs
@@ -54,4 +54,9 @@ public class PluginConfiguration : BasePluginConfiguration
/// Gets or sets a value indicating whether to replace the artist name.
///
public bool ReplaceArtistName { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether to retrieve missing track info.
+ ///
+ public bool GetMissingTrackInfo { get; set; }
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html
index 24f2ac0ca9..864b5b10aa 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html
@@ -1,4 +1,4 @@
-
+
MusicBrainz
@@ -21,6 +21,10 @@
When an artist is found during a metadata search, replace the artist name with the value on the server.
+
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs
index d0bd7d6098..50be1a6687 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
+using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
@@ -65,6 +66,7 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider s is Audio && s.IndexNumber == null) && releaseId != null)
+ {
+ var rspobj = await _musicBrainzQuery.LookupReleaseAsync(Guid.Parse(releaseId), Include.Recordings, cancellationToken).ConfigureAwait(false);
+
+ var tracks = new List();
+
+ if (rspobj.Media != null)
+ {
+ foreach (var t in rspobj.Media.Where(x => x.Tracks != null).SelectMany(x => x.Tracks!))
+ {
+ tracks.Add(t);
+ }
+ }
+
+ foreach (var c in children.Where(x =>
+ x is Audio &&
+ children.Any(p => Guid.Equals(p.Id, x.ParentId)) &&
+ x.MediaType == MediaType.Audio &&
+ ((x.RunTimeTicks == null) || (x.IndexNumber == null))))
+ {
+ long? ticks = c.RunTimeTicks;
+ int? index = c.IndexNumber;
+ var trk = tracks.FirstOrDefault(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase));
+ c.RunTimeTicks ??= trk?.Length?.Ticks ?? 0L;
+
+ c.IndexNumber ??= trk?.Position;
+
+ if ((ticks != c.RunTimeTicks) || (index != c.IndexNumber))
+ {
+ if (children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() is MusicAlbum parent)
+ {
+ parent.AddChild(c);
+ result.Item.AddChild(parent);
+ }
+ }
+ }
+ }
+ }
+
return result;
}