mirror of https://github.com/jellyfin/jellyfin.git
Compare commits
9 Commits
71cbaec863
...
4b2c7b7348
Author | SHA1 | Date |
---|---|---|
Marc Brooks | 4b2c7b7348 | |
renovate[bot] | 5612cb8178 | |
renovate[bot] | ccd06bc547 | |
Bond-009 | d29b85a134 | |
Marc Brooks | d04f255e71 | |
Marc Brooks | cb292009e0 | |
Marc Brooks | 3984e18e1a | |
Marc Brooks | 5b98a5cfbe | |
Marc Brooks | 21d8e5438e |
|
@ -20,7 +20,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
|
||||
with:
|
||||
|
|
|
@ -14,7 +14,7 @@ jobs:
|
|||
permissions: read-all
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
@ -39,7 +39,7 @@ jobs:
|
|||
permissions: read-all
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
@ -78,12 +78,12 @@ jobs:
|
|||
- openapi-base
|
||||
steps:
|
||||
- name: Download openapi-head
|
||||
uses: actions/download-artifact@9c19ed7fe5d278cd354c7dfd5d3b88589c7e2395 # v4.1.6
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
|
||||
with:
|
||||
name: openapi-head
|
||||
path: openapi-head
|
||||
- name: Download openapi-base
|
||||
uses: actions/download-artifact@9c19ed7fe5d278cd354c7dfd5d3b88589c7e2395 # v4.1.6
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
|
||||
with:
|
||||
name: openapi-base
|
||||
path: openapi-base
|
||||
|
@ -152,7 +152,7 @@ jobs:
|
|||
run: |-
|
||||
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
|
||||
- name: Download openapi-head
|
||||
uses: actions/download-artifact@9c19ed7fe5d278cd354c7dfd5d3b88589c7e2395 # v4.1.6
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
|
||||
with:
|
||||
name: openapi-head
|
||||
path: openapi-head
|
||||
|
|
|
@ -19,7 +19,7 @@ jobs:
|
|||
|
||||
runs-on: "${{ matrix.os }}"
|
||||
steps:
|
||||
- uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
|
||||
- uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
|
||||
with:
|
||||
|
|
|
@ -24,7 +24,7 @@ jobs:
|
|||
reactions: '+1'
|
||||
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
@ -51,7 +51,7 @@ jobs:
|
|||
reactions: eyes
|
||||
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
@ -128,7 +128,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: pull in script
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
repository: jellyfin/jellyfin-triage-script
|
||||
- name: install python
|
||||
|
|
|
@ -10,7 +10,7 @@ jobs:
|
|||
issues: write
|
||||
steps:
|
||||
- name: pull in script
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
repository: jellyfin/jellyfin-triage-script
|
||||
- name: install python
|
||||
|
|
|
@ -33,7 +33,7 @@ jobs:
|
|||
yq-version: v4.9.8
|
||||
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
ref: ${{ env.TAG_BRANCH }}
|
||||
|
||||
|
@ -66,7 +66,7 @@ jobs:
|
|||
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
ref: ${{ env.TAG_BRANCH }}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<PackageVersion Include="BlurHashSharp" Version="1.3.2" />
|
||||
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
||||
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
|
||||
<PackageVersion Include="Diacritics" Version="3.3.27" />
|
||||
<PackageVersion Include="Diacritics" Version="3.3.29" />
|
||||
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
|
||||
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
|
||||
<PackageVersion Include="EFCoreSecondLevelCacheInterceptor" Version="4.4.3" />
|
||||
|
|
|
@ -44,7 +44,6 @@ using MediaBrowser.Model.Library;
|
|||
using MediaBrowser.Model.Querying;
|
||||
using MediaBrowser.Model.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using TMDbLib.Objects.Authentication;
|
||||
using Episode = MediaBrowser.Controller.Entities.TV.Episode;
|
||||
using EpisodeInfo = Emby.Naming.TV.EpisodeInfo;
|
||||
using Genre = MediaBrowser.Controller.Entities.Genre;
|
||||
|
@ -1612,14 +1611,18 @@ namespace Emby.Server.Implementations.Library
|
|||
/// <returns>IEnumerable{System.String}.</returns>
|
||||
public async Task<IEnumerable<Video>> GetIntros(BaseItem item, User user)
|
||||
{
|
||||
if (IntroProviders.Length == 0)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
var tasks = IntroProviders
|
||||
.Take(1)
|
||||
.Select(i => GetIntros(i, item, user));
|
||||
|
||||
var items = await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
|
||||
return items
|
||||
.SelectMany(i => i.ToArray())
|
||||
.SelectMany(i => i)
|
||||
.Select(ResolveIntro)
|
||||
.Where(i => i is not null)!; // null values got filtered out
|
||||
}
|
||||
|
|
|
@ -274,7 +274,7 @@ namespace Emby.Server.Implementations.Library
|
|||
var tasks = _providers.Select(i => GetDynamicMediaSources(item, i, cancellationToken));
|
||||
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
|
||||
return results.SelectMany(i => i.ToList());
|
||||
return results.SelectMany(i => i);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSources(BaseItem item, IMediaSourceProvider provider, CancellationToken cancellationToken)
|
||||
|
|
|
@ -22,6 +22,7 @@ using MediaBrowser.Controller.Entities.Audio;
|
|||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
|
@ -909,7 +910,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
// Remove from middle if surrounded by spaces
|
||||
sortable = sortable.Replace(" " + search + " ", " ", StringComparison.Ordinal);
|
||||
|
||||
// Remove from end if followed by a space
|
||||
// Remove from end if preceeded by a space
|
||||
if (sortable.EndsWith(" " + search, StringComparison.Ordinal))
|
||||
{
|
||||
sortable = sortable.Remove(sortable.Length - (search.Length + 1));
|
||||
|
@ -1764,7 +1765,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
public void AddStudio(string name)
|
||||
{
|
||||
ArgumentException.ThrowIfNullOrEmpty(name);
|
||||
|
||||
name = name.Trim();
|
||||
var current = Studios;
|
||||
|
||||
if (!current.Contains(name, StringComparison.OrdinalIgnoreCase))
|
||||
|
@ -1786,7 +1787,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
|
||||
public void SetStudios(IEnumerable<string> names)
|
||||
{
|
||||
Studios = names.Distinct().ToArray();
|
||||
Studios = names.Trimmed().Distinct().ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1797,6 +1798,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
public void AddGenre(string name)
|
||||
{
|
||||
ArgumentException.ThrowIfNullOrEmpty(name);
|
||||
name = name.Trim();
|
||||
|
||||
var genres = Genres;
|
||||
if (!genres.Contains(name, StringComparison.OrdinalIgnoreCase))
|
||||
|
|
|
@ -15,6 +15,8 @@ namespace MediaBrowser.Controller.Entities
|
|||
ArgumentNullException.ThrowIfNull(person);
|
||||
ArgumentException.ThrowIfNullOrEmpty(person.Name);
|
||||
|
||||
person.Name = person.Name.Trim();
|
||||
|
||||
// Normalize
|
||||
if (string.Equals(person.Role, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
|
|
@ -30,5 +30,10 @@ namespace MediaBrowser.Controller.Sorting
|
|||
{
|
||||
return list.ThenByDescending(getName, _comparer);
|
||||
}
|
||||
|
||||
public static IEnumerable<string> Trimmed(this IEnumerable<string> values)
|
||||
{
|
||||
return values.Select(i => (i ?? string.Empty).Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -258,7 +258,12 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||
case "Network":
|
||||
foreach (var name in reader.GetStringArray())
|
||||
{
|
||||
item.AddStudio(name);
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.AddStudio(name.Trim());
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -294,7 +299,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||
var trailer = reader.ReadNormalizedString();
|
||||
if (!string.IsNullOrEmpty(trailer))
|
||||
{
|
||||
item.AddTrailerUrl(trailer);
|
||||
item.AddTrailerUrl(trailer.Trim());
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -302,7 +307,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||
var displayOrder = reader.ReadNormalizedString();
|
||||
if (!string.IsNullOrEmpty(displayOrder) && item is IHasDisplayOrder hasDisplayOrder)
|
||||
{
|
||||
hasDisplayOrder.DisplayOrder = displayOrder;
|
||||
if (!string.IsNullOrWhiteSpace(displayOrder))
|
||||
{
|
||||
hasDisplayOrder.DisplayOrder = displayOrder.Trim();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -655,7 +663,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||
var tag = reader.ReadNormalizedString();
|
||||
if (!string.IsNullOrEmpty(tag))
|
||||
{
|
||||
tags.Add(tag);
|
||||
tags.Add(tag.Trim());
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -727,7 +735,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||
var trailer = reader.ReadNormalizedString();
|
||||
if (!string.IsNullOrEmpty(trailer))
|
||||
{
|
||||
item.AddTrailerUrl(trailer);
|
||||
item.AddTrailerUrl(trailer.Trim());
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -11,6 +11,7 @@ using System.Xml;
|
|||
using Jellyfin.Data.Enums;
|
||||
using Jellyfin.Extensions;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
|
@ -531,42 +532,44 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|||
private void ProcessPairs(string key, List<NameValuePair> pairs, MediaInfo info)
|
||||
{
|
||||
List<BaseItemPerson> peoples = new List<BaseItemPerson>();
|
||||
var distinctPairs = pairs.Select(p => p.Value)
|
||||
.Where(i => !string.IsNullOrWhiteSpace(i))
|
||||
.Trimmed()
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
if (string.Equals(key, "studio", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
info.Studios = pairs.Select(p => p.Value)
|
||||
.Where(i => !string.IsNullOrWhiteSpace(i))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToArray();
|
||||
info.Studios = distinctPairs.ToArray();
|
||||
}
|
||||
else if (string.Equals(key, "screenwriters", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
foreach (var pair in pairs)
|
||||
foreach (var pair in distinctPairs)
|
||||
{
|
||||
peoples.Add(new BaseItemPerson
|
||||
{
|
||||
Name = pair.Value,
|
||||
Name = pair,
|
||||
Type = PersonKind.Writer
|
||||
});
|
||||
}
|
||||
}
|
||||
else if (string.Equals(key, "producers", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
foreach (var pair in pairs)
|
||||
foreach (var pair in distinctPairs)
|
||||
{
|
||||
peoples.Add(new BaseItemPerson
|
||||
{
|
||||
Name = pair.Value,
|
||||
Name = pair,
|
||||
Type = PersonKind.Producer
|
||||
});
|
||||
}
|
||||
}
|
||||
else if (string.Equals(key, "directors", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
foreach (var pair in pairs)
|
||||
foreach (var pair in distinctPairs)
|
||||
{
|
||||
peoples.Add(new BaseItemPerson
|
||||
{
|
||||
Name = pair.Value,
|
||||
Name = pair,
|
||||
Type = PersonKind.Director
|
||||
});
|
||||
}
|
||||
|
@ -616,7 +619,7 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|||
return new NameValuePair
|
||||
{
|
||||
Name = name,
|
||||
Value = value
|
||||
Value = value?.Trim()
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1449,7 +1452,7 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|||
continue;
|
||||
}
|
||||
|
||||
genres.Add(genre);
|
||||
genres.Add(genre.Trim());
|
||||
}
|
||||
|
||||
info.Genres = genres
|
||||
|
|
|
@ -286,7 +286,7 @@ namespace MediaBrowser.Providers.Manager
|
|||
|
||||
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
|
||||
return results.SelectMany(i => i.ToList());
|
||||
return results.SelectMany(i => i);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -14,6 +14,7 @@ using MediaBrowser.Controller.Lyrics;
|
|||
using MediaBrowser.Controller.MediaEncoding;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
|
@ -241,7 +242,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = albumArtist,
|
||||
Name = albumArtist.Trim(),
|
||||
Type = PersonKind.AlbumArtist
|
||||
});
|
||||
}
|
||||
|
@ -254,7 +255,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = performer,
|
||||
Name = performer.Trim(),
|
||||
Type = PersonKind.Artist
|
||||
});
|
||||
}
|
||||
|
@ -266,7 +267,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = composer,
|
||||
Name = composer.Trim(),
|
||||
Type = PersonKind.Composer
|
||||
});
|
||||
}
|
||||
|
@ -303,18 +304,18 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
|
||||
if (!audio.LockedFields.Contains(MetadataField.Name) && !string.IsNullOrEmpty(tags.Title))
|
||||
{
|
||||
audio.Name = tags.Title;
|
||||
audio.Name = options.ReplaceAllMetadata || string.IsNullOrEmpty(audio.Name) ? tags.Title.Trim() : audio.Name;
|
||||
}
|
||||
|
||||
if (options.ReplaceAllMetadata)
|
||||
{
|
||||
audio.Album = tags.Album;
|
||||
audio.Album = tags.Album.Trim();
|
||||
audio.IndexNumber = Convert.ToInt32(tags.Track);
|
||||
audio.ParentIndexNumber = Convert.ToInt32(tags.Disc);
|
||||
}
|
||||
else
|
||||
{
|
||||
audio.Album ??= tags.Album;
|
||||
audio.Album ??= tags.Album.Trim();
|
||||
audio.IndexNumber ??= Convert.ToInt32(tags.Track);
|
||||
audio.ParentIndexNumber ??= Convert.ToInt32(tags.Disc);
|
||||
}
|
||||
|
@ -333,7 +334,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
if (!audio.LockedFields.Contains(MetadataField.Genres))
|
||||
{
|
||||
audio.Genres = options.ReplaceAllMetadata || audio.Genres == null || audio.Genres.Length == 0
|
||||
? tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray()
|
||||
? tags.Genres.Trimmed().Distinct(StringComparer.OrdinalIgnoreCase).ToArray()
|
||||
: audio.Genres;
|
||||
}
|
||||
|
||||
|
|
|
@ -508,9 +508,9 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = person.Name,
|
||||
Name = person.Name.Trim(),
|
||||
Type = person.Type,
|
||||
Role = person.Role
|
||||
Role = person.Role.Trim()
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -187,7 +187,7 @@ namespace MediaBrowser.Providers.Music
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = albumArtist,
|
||||
Name = albumArtist.Trim(),
|
||||
Type = PersonKind.AlbumArtist
|
||||
});
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ namespace MediaBrowser.Providers.Music
|
|||
{
|
||||
PeopleHelper.AddPerson(people, new PersonInfo
|
||||
{
|
||||
Name = artist,
|
||||
Name = artist.Trim(),
|
||||
Type = PersonKind.Artist
|
||||
});
|
||||
}
|
||||
|
|
|
@ -424,7 +424,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb
|
|||
{
|
||||
var person = new PersonInfo
|
||||
{
|
||||
Name = result.Director,
|
||||
Name = result.Director.Trim(),
|
||||
Type = PersonKind.Director
|
||||
};
|
||||
|
||||
|
@ -435,7 +435,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb
|
|||
{
|
||||
var person = new PersonInfo
|
||||
{
|
||||
Name = result.Writer,
|
||||
Name = result.Writer.Trim(),
|
||||
Type = PersonKind.Writer
|
||||
};
|
||||
|
||||
|
@ -449,7 +449,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb
|
|||
{
|
||||
var person = new PersonInfo
|
||||
{
|
||||
Name = actor,
|
||||
Name = actor.Trim(),
|
||||
Type = PersonKind.Actor
|
||||
};
|
||||
|
||||
|
|
|
@ -258,7 +258,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
|
|||
var personInfo = new PersonInfo
|
||||
{
|
||||
Name = actor.Name.Trim(),
|
||||
Role = actor.Character,
|
||||
Role = actor.Character.Trim(),
|
||||
Type = PersonKind.Actor,
|
||||
SortOrder = actor.Order
|
||||
};
|
||||
|
@ -293,7 +293,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
|
|||
var personInfo = new PersonInfo
|
||||
{
|
||||
Name = person.Name.Trim(),
|
||||
Role = person.Job,
|
||||
Role = person.Job?.Trim(),
|
||||
Type = type
|
||||
};
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
metadataResult.AddPerson(new PersonInfo
|
||||
{
|
||||
Name = actor.Name.Trim(),
|
||||
Role = actor.Character,
|
||||
Role = actor.Character.Trim(),
|
||||
Type = PersonKind.Actor,
|
||||
SortOrder = actor.Order
|
||||
});
|
||||
|
@ -236,7 +236,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
metadataResult.AddPerson(new PersonInfo
|
||||
{
|
||||
Name = guest.Name.Trim(),
|
||||
Role = guest.Character,
|
||||
Role = guest.Character.Trim(),
|
||||
Type = PersonKind.GuestStar,
|
||||
SortOrder = guest.Order
|
||||
});
|
||||
|
@ -260,7 +260,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
metadataResult.AddPerson(new PersonInfo
|
||||
{
|
||||
Name = person.Name.Trim(),
|
||||
Role = person.Job,
|
||||
Role = person.Job?.Trim(),
|
||||
Type = type
|
||||
});
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
result.AddPerson(new PersonInfo
|
||||
{
|
||||
Name = cast[i].Name.Trim(),
|
||||
Role = cast[i].Character,
|
||||
Role = cast[i].Character.Trim(),
|
||||
Type = PersonKind.Actor,
|
||||
SortOrder = cast[i].Order
|
||||
});
|
||||
|
@ -111,7 +111,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
result.AddPerson(new PersonInfo
|
||||
{
|
||||
Name = person.Name.Trim(),
|
||||
Role = person.Job,
|
||||
Role = person.Job?.Trim(),
|
||||
Type = type
|
||||
});
|
||||
}
|
||||
|
|
|
@ -352,7 +352,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
var personInfo = new PersonInfo
|
||||
{
|
||||
Name = actor.Name.Trim(),
|
||||
Role = actor.Character,
|
||||
Role = actor.Character.Trim(),
|
||||
Type = PersonKind.Actor,
|
||||
SortOrder = actor.Order,
|
||||
ImageUrl = _tmdbClientManager.GetPosterUrl(actor.ProfilePath)
|
||||
|
@ -390,7 +390,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
|
|||
yield return new PersonInfo
|
||||
{
|
||||
Name = person.Name.Trim(),
|
||||
Role = person.Job,
|
||||
Role = person.Job?.Trim(),
|
||||
Type = type
|
||||
};
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ using MediaBrowser.Controller.Configuration;
|
|||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.IO;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
@ -55,12 +56,12 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|||
{
|
||||
var album = (MusicAlbum)item;
|
||||
|
||||
foreach (var artist in album.Artists)
|
||||
foreach (var artist in album.Artists.Trimmed().OrderBy(artist => artist))
|
||||
{
|
||||
writer.WriteElementString("artist", artist);
|
||||
}
|
||||
|
||||
foreach (var artist in album.AlbumArtists)
|
||||
foreach (var artist in album.AlbumArtists.Trimmed().OrderBy(artist => artist))
|
||||
{
|
||||
writer.WriteElementString("albumartist", artist);
|
||||
}
|
||||
|
@ -70,11 +71,19 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|||
|
||||
private void AddTracks(IEnumerable<BaseItem> tracks, XmlWriter writer)
|
||||
{
|
||||
foreach (var track in tracks.OrderBy(i => i.ParentIndexNumber ?? 0).ThenBy(i => i.IndexNumber ?? 0))
|
||||
foreach (var track in tracks
|
||||
.OrderBy(i => i.ParentIndexNumber ?? 0)
|
||||
.ThenBy(i => i.IndexNumber ?? 0)
|
||||
.ThenBy(i => i.Name?.Trim()))
|
||||
{
|
||||
writer.WriteStartElement("track");
|
||||
|
||||
if (track.IndexNumber.HasValue)
|
||||
if (track.ParentIndexNumber.HasValue && track.ParentIndexNumber.Value != 0)
|
||||
{
|
||||
writer.WriteElementString("disc", track.ParentIndexNumber.Value.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
if (track.IndexNumber.HasValue && track.IndexNumber.Value != 0)
|
||||
{
|
||||
writer.WriteElementString("position", track.IndexNumber.Value.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.IO;
|
||||
using MediaBrowser.XbmcMetadata.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
@ -69,7 +71,10 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|||
|
||||
private void AddAlbums(IList<BaseItem> albums, XmlWriter writer)
|
||||
{
|
||||
foreach (var album in albums)
|
||||
foreach (var album in albums
|
||||
.OrderBy(album => album.ProductionYear ?? 0)
|
||||
.ThenBy(album => album.SortName?.Trim())
|
||||
.ThenBy(album => album.Name?.Trim()))
|
||||
{
|
||||
writer.WriteStartElement("album");
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ using MediaBrowser.Controller.Entities.Audio;
|
|||
using MediaBrowser.Controller.Entities.Movies;
|
||||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.IO;
|
||||
|
@ -488,7 +489,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 +501,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 +516,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));
|
||||
}
|
||||
|
@ -660,22 +664,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)
|
||||
{
|
||||
|
@ -752,7 +756,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 +768,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 +789,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 +804,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 +848,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));
|
||||
}
|
||||
|
@ -913,7 +922,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|||
|
||||
private void AddActors(List<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))
|
||||
{
|
||||
|
|
|
@ -8,6 +8,7 @@ using MediaBrowser.Controller.Entities.Movies;
|
|||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Controller.Sorting;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.IO;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
@ -103,7 +104,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
|||
|
||||
if (item is MusicVideo musicVideo)
|
||||
{
|
||||
foreach (var artist in musicVideo.Artists)
|
||||
foreach (var artist in musicVideo.Artists.Trimmed().OrderBy(artist => artist))
|
||||
{
|
||||
writer.WriteElementString("artist", artist);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue