|
@@ -488,7 +488,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
var directors = people
|
|
|
.Where(i => i.IsType(PersonKind.Director))
|
|
|
- .Select(i => i.Name)
|
|
|
+ .Select(i => i.Name?.Trim())
|
|
|
+ .Distinct(StringComparer.OrdinalIgnoreCase)
|
|
|
+ .OrderBy(i => i)
|
|
|
.ToList();
|
|
|
|
|
|
foreach (var person in directors)
|
|
@@ -498,8 +500,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
var writers = people
|
|
|
.Where(i => i.IsType(PersonKind.Writer))
|
|
|
- .Select(i => i.Name)
|
|
|
+ .Select(i => i.Name?.Trim())
|
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
|
+ .OrderBy(i => i)
|
|
|
.ToList();
|
|
|
|
|
|
foreach (var person in writers)
|
|
@@ -512,7 +515,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
writer.WriteElementString("credits", person);
|
|
|
}
|
|
|
|
|
|
- foreach (var trailer in item.RemoteTrailers)
|
|
|
+ foreach (var trailer in item.RemoteTrailers.OrderBy(t => t.Url?.Trim()))
|
|
|
{
|
|
|
writer.WriteElementString("trailer", GetOutputTrailerUrl(trailer.Url));
|
|
|
}
|
|
@@ -544,16 +547,13 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio);
|
|
|
}
|
|
|
|
|
|
- var tmdbCollection = item.GetProviderId(MetadataProvider.TmdbCollection);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(tmdbCollection))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdbCollection))
|
|
|
{
|
|
|
writer.WriteElementString("collectionnumber", tmdbCollection);
|
|
|
writtenProviderIds.Add(MetadataProvider.TmdbCollection.ToString());
|
|
|
}
|
|
|
|
|
|
- var imdb = item.GetProviderId(MetadataProvider.Imdb);
|
|
|
- if (!string.IsNullOrEmpty(imdb))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.Imdb, out var imdb))
|
|
|
{
|
|
|
if (item is Series)
|
|
|
{
|
|
@@ -570,16 +570,14 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
// Series xml saver already saves this
|
|
|
if (item is not Series)
|
|
|
{
|
|
|
- var tvdb = item.GetProviderId(MetadataProvider.Tvdb);
|
|
|
- if (!string.IsNullOrEmpty(tvdb))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.Tvdb, out var tvdb))
|
|
|
{
|
|
|
writer.WriteElementString("tvdbid", tvdb);
|
|
|
writtenProviderIds.Add(MetadataProvider.Tvdb.ToString());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var tmdb = item.GetProviderId(MetadataProvider.Tmdb);
|
|
|
- if (!string.IsNullOrEmpty(tmdb))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdb))
|
|
|
{
|
|
|
writer.WriteElementString("tmdbid", tmdb);
|
|
|
writtenProviderIds.Add(MetadataProvider.Tmdb.ToString());
|
|
@@ -660,22 +658,22 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
writer.WriteElementString("tagline", item.Tagline);
|
|
|
}
|
|
|
|
|
|
- foreach (var country in item.ProductionLocations)
|
|
|
+ foreach (var country in item.ProductionLocations.Trimmed().OrderBy(country => country))
|
|
|
{
|
|
|
writer.WriteElementString("country", country);
|
|
|
}
|
|
|
|
|
|
- foreach (var genre in item.Genres)
|
|
|
+ foreach (var genre in item.Genres.Trimmed().OrderBy(genre => genre))
|
|
|
{
|
|
|
writer.WriteElementString("genre", genre);
|
|
|
}
|
|
|
|
|
|
- foreach (var studio in item.Studios)
|
|
|
+ foreach (var studio in item.Studios.Trimmed().OrderBy(studio => studio))
|
|
|
{
|
|
|
writer.WriteElementString("studio", studio);
|
|
|
}
|
|
|
|
|
|
- foreach (var tag in item.Tags)
|
|
|
+ foreach (var tag in item.Tags.Trimmed().OrderBy(tag => tag))
|
|
|
{
|
|
|
if (item is MusicAlbum || item is MusicArtist)
|
|
|
{
|
|
@@ -687,64 +685,49 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var externalId = item.GetProviderId(MetadataProvider.AudioDbArtist);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.AudioDbArtist, out var externalId))
|
|
|
{
|
|
|
writer.WriteElementString("audiodbartistid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.AudioDbArtist.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.AudioDbAlbum);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.AudioDbAlbum, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("audiodbalbumid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.AudioDbAlbum.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.Zap2It);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.Zap2It, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("zap2itid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.Zap2It.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbum);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbum, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("musicbrainzalbumid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbum.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbumArtist, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("musicbrainzalbumartistid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbumArtist.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("musicbrainzartistid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.MusicBrainzArtist.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.MusicBrainzReleaseGroup, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("musicbrainzreleasegroupid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.MusicBrainzReleaseGroup.ToString());
|
|
|
}
|
|
|
|
|
|
- externalId = item.GetProviderId(MetadataProvider.TvRage);
|
|
|
- if (!string.IsNullOrEmpty(externalId))
|
|
|
+ if (item.TryGetProviderId(MetadataProvider.TvRage, out externalId))
|
|
|
{
|
|
|
writer.WriteElementString("tvrageid", externalId);
|
|
|
writtenProviderIds.Add(MetadataProvider.TvRage.ToString());
|
|
@@ -752,7 +735,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
if (item.ProviderIds is not null)
|
|
|
{
|
|
|
- foreach (var providerKey in item.ProviderIds.Keys)
|
|
|
+ foreach (var providerKey in item.ProviderIds.Keys.OrderBy(providerKey => providerKey))
|
|
|
{
|
|
|
var providerId = item.ProviderIds[providerKey];
|
|
|
if (!string.IsNullOrEmpty(providerId) && !writtenProviderIds.Contains(providerKey))
|
|
@@ -764,7 +747,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
XmlConvert.VerifyName(tagName);
|
|
|
Logger.LogDebug("Saving custom provider tagname {0}", tagName);
|
|
|
|
|
|
- writer.WriteElementString(GetTagForProviderKey(providerKey), providerId);
|
|
|
+ writer.WriteElementString(tagName, providerId);
|
|
|
}
|
|
|
catch (ArgumentException)
|
|
|
{
|
|
@@ -785,7 +768,10 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
AddUserData(item, writer, userManager, userDataRepo, options);
|
|
|
|
|
|
- AddActors(people, writer, libraryManager, options.SaveImagePathsInNfo);
|
|
|
+ if (item is not MusicAlbum && item is not MusicArtist)
|
|
|
+ {
|
|
|
+ AddActors(people, writer, libraryManager, options.SaveImagePathsInNfo);
|
|
|
+ }
|
|
|
|
|
|
if (item is BoxSet folder)
|
|
|
{
|
|
@@ -797,6 +783,8 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
{
|
|
|
var items = item.LinkedChildren
|
|
|
.Where(i => i.Type == LinkedChildType.Manual)
|
|
|
+ .OrderBy(i => i.Path?.Trim())
|
|
|
+ .ThenBy(i => i.LibraryItemId?.Trim())
|
|
|
.ToList();
|
|
|
|
|
|
foreach (var link in items)
|
|
@@ -839,7 +827,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
writer.WriteElementString("poster", GetImagePathToSave(image, libraryManager));
|
|
|
}
|
|
|
|
|
|
- foreach (var backdrop in item.GetImages(ImageType.Backdrop))
|
|
|
+ foreach (var backdrop in item.GetImages(ImageType.Backdrop).OrderBy(b => b.Path?.Trim()))
|
|
|
{
|
|
|
writer.WriteElementString("fanart", GetImagePathToSave(backdrop, libraryManager));
|
|
|
}
|
|
@@ -916,7 +904,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
private void AddActors(IReadOnlyList<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
|
|
|
{
|
|
|
- foreach (var person in people)
|
|
|
+ foreach (var person in people
|
|
|
+ .OrderBy(person => person.SortOrder ?? 0)
|
|
|
+ .ThenBy(person => person.Name?.Trim()))
|
|
|
{
|
|
|
if (person.IsType(PersonKind.Director) || person.IsType(PersonKind.Writer))
|
|
|
{
|
|
@@ -1027,5 +1017,24 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|
|
|
|
|
private string GetTagForProviderKey(string providerKey)
|
|
|
=> providerKey.ToLowerInvariant() + "id";
|
|
|
+
|
|
|
+ protected static string SortNameOrName(BaseItem item)
|
|
|
+ {
|
|
|
+ if (item == null)
|
|
|
+ {
|
|
|
+ return string.Empty;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.SortName != null)
|
|
|
+ {
|
|
|
+ string trimmed = item.SortName.Trim();
|
|
|
+ if (trimmed.Length > 0)
|
|
|
+ {
|
|
|
+ return trimmed;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return (item.Name ?? string.Empty).Trim();
|
|
|
+ }
|
|
|
}
|
|
|
}
|