From c0ccd90468c936300d620931dad204dd8b726fc8 Mon Sep 17 00:00:00 2001 From: fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Tue, 16 Dec 2025 16:16:47 +0800 Subject: [PATCH] fix: sanitize disallowed characters in arr tags Updates the tag creation to normalize diacritics, replace spaces with hyphens and stip any non-alphanumeric characters from display name fix #2229, fix #1897 --- .../migrations/0007_migrate_arr_tags.ts | 30 +++++++++++++---- server/subscriber/MediaRequestSubscriber.ts | 32 ++++++++++++++++--- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/server/lib/settings/migrations/0007_migrate_arr_tags.ts b/server/lib/settings/migrations/0007_migrate_arr_tags.ts index 25911f93b..273a2b475 100644 --- a/server/lib/settings/migrations/0007_migrate_arr_tags.ts +++ b/server/lib/settings/migrations/0007_migrate_arr_tags.ts @@ -30,15 +30,24 @@ const migrationArrTags = async (settings: any): Promise => { }); const radarrTags = await radarr.getTags(); for (const user of users) { - const userTag = radarrTags.find((v) => - v.label.startsWith(user.id + ' - ') + const userTag = radarrTags.find( + (v) => + v.label.startsWith(user.id + ' - ') || + v.label.startsWith(user.id + '-') ); if (!userTag) { continue; } await radarr.renameTag({ id: userTag.id, - label: userTag.label.replace(`${user.id} - `, `${user.id}-`), + label: + user.id + + '-' + + user.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); } } catch (error) { @@ -61,15 +70,24 @@ const migrationArrTags = async (settings: any): Promise => { }); const sonarrTags = await sonarr.getTags(); for (const user of users) { - const userTag = sonarrTags.find((v) => - v.label.startsWith(user.id + ' - ') + const userTag = sonarrTags.find( + (v) => + v.label.startsWith(user.id + ' - ') || + v.label.startsWith(user.id + '-') ); if (!userTag) { continue; } await sonarr.renameTag({ id: userTag.id, - label: userTag.label.replace(`${user.id} - `, `${user.id}-`), + label: + user.id + + '-' + + user.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); } } catch (error) { diff --git a/server/subscriber/MediaRequestSubscriber.ts b/server/subscriber/MediaRequestSubscriber.ts index 5c1b9bb02..25cf43e53 100644 --- a/server/subscriber/MediaRequestSubscriber.ts +++ b/server/subscriber/MediaRequestSubscriber.ts @@ -310,11 +310,23 @@ export class MediaRequestSubscriber mediaId: entity.media.id, userId: entity.requestedBy.id, newTag: - entity.requestedBy.id + '-' + entity.requestedBy.displayName, + entity.requestedBy.id + + '-' + + entity.requestedBy.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); userTag = await radarr.createTag({ label: - entity.requestedBy.id + '-' + entity.requestedBy.displayName, + entity.requestedBy.id + + '-' + + entity.requestedBy.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); } if (userTag.id) { @@ -631,11 +643,23 @@ export class MediaRequestSubscriber mediaId: entity.media.id, userId: entity.requestedBy.id, newTag: - entity.requestedBy.id + '-' + entity.requestedBy.displayName, + entity.requestedBy.id + + '-' + + entity.requestedBy.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); userTag = await sonarr.createTag({ label: - entity.requestedBy.id + '-' + entity.requestedBy.displayName, + entity.requestedBy.id + + '-' + + entity.requestedBy.displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, ''), }); } if (userTag.id) {