From c50b45592e589488363970981290dafdeea5b7af Mon Sep 17 00:00:00 2001 From: fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Wed, 17 Dec 2025 01:38:19 +0800 Subject: [PATCH] refactor: improve display name sanitization in tag creation --- .../migrations/0007_migrate_arr_tags.ts | 8 +++-- server/subscriber/MediaRequestSubscriber.ts | 34 ++++++++----------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/server/lib/settings/migrations/0007_migrate_arr_tags.ts b/server/lib/settings/migrations/0007_migrate_arr_tags.ts index 273a2b475..07d3b19c5 100644 --- a/server/lib/settings/migrations/0007_migrate_arr_tags.ts +++ b/server/lib/settings/migrations/0007_migrate_arr_tags.ts @@ -47,7 +47,9 @@ const migrationArrTags = async (settings: any): Promise => { .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + .replace(/[^a-z0-9-]/gi, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''), }); } } catch (error) { @@ -87,7 +89,9 @@ const migrationArrTags = async (settings: any): Promise => { .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + .replace(/[^a-z0-9-]/gi, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''), }); } } catch (error) { diff --git a/server/subscriber/MediaRequestSubscriber.ts b/server/subscriber/MediaRequestSubscriber.ts index 25cf43e53..251ee47ef 100644 --- a/server/subscriber/MediaRequestSubscriber.ts +++ b/server/subscriber/MediaRequestSubscriber.ts @@ -29,6 +29,16 @@ import type { } from 'typeorm'; import { EventSubscriber } from 'typeorm'; +const sanitizeDisplayName = (displayName: string): string => { + return displayName + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/gi, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); +}; + @EventSubscriber() export class MediaRequestSubscriber implements EntitySubscriberInterface @@ -312,21 +322,13 @@ export class MediaRequestSubscriber newTag: entity.requestedBy.id + '-' + - entity.requestedBy.displayName - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + sanitizeDisplayName(entity.requestedBy.displayName), }); userTag = await radarr.createTag({ label: entity.requestedBy.id + '-' + - entity.requestedBy.displayName - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + sanitizeDisplayName(entity.requestedBy.displayName), }); } if (userTag.id) { @@ -645,21 +647,13 @@ export class MediaRequestSubscriber newTag: entity.requestedBy.id + '-' + - entity.requestedBy.displayName - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + sanitizeDisplayName(entity.requestedBy.displayName), }); userTag = await sonarr.createTag({ label: entity.requestedBy.id + '-' + - entity.requestedBy.displayName - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/gi, ''), + sanitizeDisplayName(entity.requestedBy.displayName), }); } if (userTag.id) {