From a75fc39ddd2b0b5b5a68564a8a04f1dd359bf49a Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Thu, 16 Feb 2023 17:30:47 -0500 Subject: [PATCH 1/8] Add ability to get track number and length from MusicBrainz for tracks where this is null --- .../Configuration/PluginConfiguration.cs | 5 ++ .../MusicBrainz/Configuration/config.html | 6 +- .../MusicBrainz/MusicBrainzAlbumProvider.cs | 59 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs index 22229e377d..a5c6a49017 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/PluginConfiguration.cs @@ -49,4 +49,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 6f1296bb77..6cb1a3af23 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/Configuration/config.html @@ -1,4 +1,4 @@ - + MusicBrainz @@ -20,6 +20,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 34f45f0d57..2004365fbf 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs @@ -256,6 +256,65 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider s is Audio && s.IndexNumber == null)) + { + var rspobj = _musicBrainzQuery.LookupRelease(Guid.Parse(releaseId ?? string.Empty), Include.Recordings); + + IList tracks = new List(); + + if (rspobj.Media != null) + { + foreach (var t in rspobj.Media.SelectMany(m => m.Tracks)) + { + if (t != null) + { + tracks.Add(t); + } + } + } + + foreach (var c in result.Item.Children.Where(x => + x is Audio && + result.Item.Children.Any(p => Guid.Equals(p.Id, x.ParentId)) && + string.Equals(x.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && + x.RunTimeTicks == null)) + { + var newlength = tracks.Where(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.Length; + if (newlength != null) + { + c.RunTimeTicks = newlength.HasValue ? newlength.Value.Ticks : 0; + var parent = result.Item.Children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() as MusicAlbum; + if (parent != null) + { + parent.AddChild(c); + result.Item.AddChild(parent); + } + } + } + + foreach (var c in result.Item.Children.Where(x => + x is Audio && + result.Item.Children.Any(p => Guid.Equals(p.Id, x.ParentId)) && + string.Equals(x.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && + x.IndexNumber == null)) + { + var newindex = tracks.Where(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.Position; + if (newindex != null) + { + c.IndexNumber = newindex; + var parent = result.Item.Children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() as MusicAlbum; + if (parent != null) + { + parent.AddChild(c); + result.Item.AddChild(parent); + } + } + } + } + } + return result; } From 430a53d5cdc82698126a05b4c89479a6d4741090 Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Fri, 17 Feb 2023 12:13:39 -0500 Subject: [PATCH 2/8] Null check to pass the test... previous code worked fine on my computer *shrug* --- .../Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs index 2004365fbf..1fa8216cc6 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs @@ -266,11 +266,17 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider m.Tracks)) + foreach (var m in rspobj.Media) { - if (t != null) + if (m.Tracks != null) { - tracks.Add(t); + foreach (var t in m.Tracks) + { + if (t != null) + { + tracks.Add(t); + } + } } } } From ff469399fb0911d57adb27579a83468f3418babe Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Wed, 5 Jul 2023 12:34:21 -0400 Subject: [PATCH 3/8] #r1208107071 move null check into if-condition --- .../Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs index 1fa8216cc6..660c886659 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs @@ -258,9 +258,9 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider s is Audio && s.IndexNumber == null)) + if (result.Item.Children.Any(s => s is Audio && s.IndexNumber == null) && releaseId != null) { - var rspobj = _musicBrainzQuery.LookupRelease(Guid.Parse(releaseId ?? string.Empty), Include.Recordings); + var rspobj = _musicBrainzQuery.LookupRelease(Guid.Parse(releaseId), Include.Recordings); IList tracks = new List(); From 1ca7e9968eab30dea25d53d40f18f3621841449b Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Sat, 12 Aug 2023 20:22:55 -0400 Subject: [PATCH 4/8] evaluate result.item.Children to an array to avoid extra db calls collapse nested foreach's and null check's put runtime update and track index update in same loop --- .../MusicBrainz/MusicBrainzAlbumProvider.cs | 55 +++++++------------ 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs index 660c886659..2ce3a55506 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs @@ -258,7 +258,8 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider s is Audio && s.IndexNumber == null) && releaseId != null) + var children = result.Item.Children.ToArray(); + if (children.Any(s => s is Audio && s.IndexNumber == null) && releaseId != null) { var rspobj = _musicBrainzQuery.LookupRelease(Guid.Parse(releaseId), Include.Recordings); @@ -266,52 +267,34 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider x.Tracks != null).SelectMany(x => x.Tracks!)) { - if (m.Tracks != null) - { - foreach (var t in m.Tracks) - { - if (t != null) - { - tracks.Add(t); - } - } - } + tracks.Add(t); } } - foreach (var c in result.Item.Children.Where(x => + foreach (var c in children.Where(x => x is Audio && - result.Item.Children.Any(p => Guid.Equals(p.Id, x.ParentId)) && + children.Any(p => Guid.Equals(p.Id, x.ParentId)) && string.Equals(x.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && - x.RunTimeTicks == null)) + ((x.RunTimeTicks == null) || (x.IndexNumber == null)))) { - var newlength = tracks.Where(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.Length; - if (newlength != null) + long? ticks = c.RunTimeTicks; + int? index = c.IndexNumber; + var trk = tracks.FirstOrDefault(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)); + if (c.RunTimeTicks == null) { - c.RunTimeTicks = newlength.HasValue ? newlength.Value.Ticks : 0; - var parent = result.Item.Children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() as MusicAlbum; - if (parent != null) - { - parent.AddChild(c); - result.Item.AddChild(parent); - } + c.RunTimeTicks = trk?.Length?.Ticks ?? 0L; } - } - foreach (var c in result.Item.Children.Where(x => - x is Audio && - result.Item.Children.Any(p => Guid.Equals(p.Id, x.ParentId)) && - string.Equals(x.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && - x.IndexNumber == null)) - { - var newindex = tracks.Where(t => string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.Position; - if (newindex != null) + if (c.IndexNumber == null) + { + c.IndexNumber = trk?.Position; + } + + if ((ticks != c.RunTimeTicks) || (index != c.IndexNumber)) { - c.IndexNumber = newindex; - var parent = result.Item.Children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() as MusicAlbum; - if (parent != null) + if (children.Where(p => Guid.Equals(p.Id, c.ParentId)).FirstOrDefault() is MusicAlbum parent) { parent.AddChild(c); result.Item.AddChild(parent); From 6c325d0831a1b0b552656e88dfbd880f51feef73 Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Sat, 12 Aug 2023 20:27:12 -0400 Subject: [PATCH 5/8] compiler does not like having ReadOnlySpan in this foreach declaration, use var and AsSpan() instead --- .../LiveTv/Listings/SchedulesDirect.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index 3f7914d3bb..11539d1daf 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -463,10 +463,10 @@ namespace Emby.Server.Implementations.LiveTv.Listings } StringBuilder str = new StringBuilder("[", 1 + (programIds.Count * 13)); - foreach (ReadOnlySpan i in programIds) + foreach (var i in programIds) { str.Append('"') - .Append(i.Slice(0, 10)) + .Append(i.AsSpan().Slice(0, 10)) .Append("\","); } From 06ff5b2f6dacc8d332717af88c444deedcd64673 Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Sat, 12 Aug 2023 20:39:55 -0400 Subject: [PATCH 6/8] use the existing fix --- Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index 11539d1daf..01e703b9df 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -466,7 +466,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings foreach (var i in programIds) { str.Append('"') - .Append(i.AsSpan().Slice(0, 10)) + .Append(i[..10]) .Append("\","); } From 86f68e6ed5b8483801ebbbd5fc9c9893e9e3edd4 Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Tue, 26 Dec 2023 21:17:10 -0500 Subject: [PATCH 7/8] style: use LookupReleaseAsync style: do not force IList style: compare MediaType using == rather than string.Equals --- .../Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs index 4e5c4ba222..4813a63503 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; @@ -279,9 +280,9 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider s is Audio && s.IndexNumber == null) && releaseId != null) { - var rspobj = _musicBrainzQuery.LookupRelease(Guid.Parse(releaseId), Include.Recordings); + var rspobj = await _musicBrainzQuery.LookupReleaseAsync(Guid.Parse(releaseId), Include.Recordings, cancellationToken).ConfigureAwait(false); - IList tracks = new List(); + var tracks = new List(); if (rspobj.Media != null) { @@ -294,7 +295,7 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider x is Audio && children.Any(p => Guid.Equals(p.Id, x.ParentId)) && - string.Equals(x.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) && + x.MediaType == MediaType.Audio && ((x.RunTimeTicks == null) || (x.IndexNumber == null)))) { long? ticks = c.RunTimeTicks; From 293f94094593ee1de901ddf2422842c3e7b91162 Mon Sep 17 00:00:00 2001 From: Scott Karbon Date: Tue, 26 Dec 2023 21:54:21 -0500 Subject: [PATCH 8/8] style: use compound assignment style: dispose before new Query --- .../Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs index 4813a63503..50be1a6687 100644 --- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumProvider.cs @@ -66,6 +66,7 @@ public class MusicBrainzAlbumProvider : IRemoteMetadataProvider string.Equals(t.Title, c.Name, StringComparison.OrdinalIgnoreCase)); - if (c.RunTimeTicks == null) - { - c.RunTimeTicks = trk?.Length?.Ticks ?? 0L; - } + c.RunTimeTicks ??= trk?.Length?.Ticks ?? 0L; - if (c.IndexNumber == null) - { - c.IndexNumber = trk?.Position; - } + c.IndexNumber ??= trk?.Position; if ((ticks != c.RunTimeTicks) || (index != c.IndexNumber)) {