Use a re-usable Intl.Collator instance for locale compare when possible (#1638)

* Use a re-usable Intl.Collator instance for locale compare
This commit is contained in:
Damien Erambert
2026-02-02 18:28:01 -08:00
committed by GitHub
parent a45b607fe7
commit 72fc5beb98
3 changed files with 28 additions and 16 deletions
@@ -38,6 +38,10 @@ const formatCommaDelimitedString = (value: string[]) => {
// not the POST body
const MAX_ITEMS_PER_PLAYLIST_ADD = 50;
// Defining a re-usable Collator instance for performance reasons.
const numericSortCollator = new Intl.Collator(undefined, { numeric: true });
const collator = new Intl.Collator();
const VERSION_INFO: VersionInfo = [
[
'10.9.0',
@@ -1250,11 +1254,12 @@ export const JellyfinController: InternalControllerEndpoint = {
if (res.body.Tags?.length) {
tags.push({
name: 'Tags',
options: res.body.Tags.sort((a, b) =>
a
.toLocaleLowerCase()
.localeCompare(b.toLocaleLowerCase(), undefined, { numeric: true }),
).map((tag) => ({ id: tag, name: tag })),
options: res.body.Tags.sort((a, b) => {
return numericSortCollator.compare(
a.toLocaleLowerCase(),
b.toLocaleLowerCase(),
);
}).map((tag) => ({ id: tag, name: tag })),
});
}
@@ -1262,7 +1267,7 @@ export const JellyfinController: InternalControllerEndpoint = {
tags.push({
name: 'Studios',
options: studioRes.body.Items.sort((a, b) =>
a.Name.toLocaleLowerCase().localeCompare(b.Name.toLocaleLowerCase()),
collator.compare(a.Name.toLocaleLowerCase(), b.Name.toLocaleLowerCase()),
).map((option) => ({ id: option.Name, name: option.Name })),
});
}
@@ -71,6 +71,10 @@ const EXCLUDED_ALBUM_TAGS = new Set<string>([
const EXCLUDED_SONG_TAGS = new Set<string>(['disctotal', 'tracktotal']);
// Defining a re-usable Collator instance for performance reasons.
const numericSortCollator = new Intl.Collator(undefined, { numeric: true });
const collator = new Intl.Collator();
// Tags that use IDs as values as opposed to the tag value
const ID_TAGS = new Set<string>(['albumversion', 'mood']);
@@ -780,16 +784,17 @@ export const NavidromeController: InternalControllerEndpoint = {
.map((data) => ({
name: data[0],
options: data[1]
.sort((a, b) =>
a.name
.toLocaleLowerCase()
.localeCompare(b.name.toLocaleLowerCase(), undefined, {
numeric: true,
}),
)
.sort((a, b) => {
return numericSortCollator.compare(
a.name.toLocaleLowerCase(),
b.name.toLocaleLowerCase(),
);
})
.map((option) => ({ id: option.id, name: option.name })),
}))
.sort((a, b) => a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()));
.sort((a, b) =>
collator.compare(a.name.toLocaleLowerCase(), b.name.toLocaleLowerCase()),
);
const excludedAlbumTags = Array.from(EXCLUDED_ALBUM_TAGS.values());
const excludedSongTags = Array.from(EXCLUDED_SONG_TAGS.values());