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; }