diff --git a/code/frontend/src/app/core/feature-badges/feature-registry.ts b/code/frontend/src/app/core/feature-badges/feature-registry.ts
index 9e3fe323..22d35754 100644
--- a/code/frontend/src/app/core/feature-badges/feature-registry.ts
+++ b/code/frontend/src/app/core/feature-badges/feature-registry.ts
@@ -68,4 +68,5 @@ export const NEW_FEATURES: NewFeature[] = [
{ id: 'seeker-quiet-hours' },
{ id: 'seeker-radarr-release-gate' },
{ id: 'seeker-whisparr' },
+ { id: 'seeker-lidarr' },
];
diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts
index d9e7153d..bf1360df 100644
--- a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts
+++ b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts
@@ -162,6 +162,7 @@ describe('funnelStages', () => {
expect(funnelStages(funnel, 'Radarr').narrowing[0]).toEqual({ label: 'movies', value: 10 });
expect(funnelStages(funnel, 'Sonarr').narrowing[0]).toEqual({ label: 'series', value: 10 });
expect(funnelStages(funnel, 'Whisparr').narrowing[0]).toEqual({ label: 'movies', value: 10 });
+ expect(funnelStages(funnel, 'Lidarr').narrowing[0]).toEqual({ label: 'artists', value: 10 });
});
it('splits the units needing a search by state', () => {
diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts
index 31ac5bdc..b7313a8f 100644
--- a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts
+++ b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts
@@ -79,6 +79,17 @@ export interface FunnelStage {
value: number;
}
+function libraryLabel(instanceType: string): string {
+ switch (instanceType) {
+ case 'Sonarr':
+ return 'series';
+ case 'Lidarr':
+ return 'artists';
+ default:
+ return 'movies';
+ }
+}
+
/**
* Splits the funnel into the stages that narrow the library down to units needing a search,
* and the split of those units by state.
@@ -87,7 +98,7 @@ export function funnelStages(funnel: InstanceFunnel, instanceType: string): { na
const resting: FunnelStage[] = funnel.restingUnits > 0 ? [{ label: 'resting', value: funnel.restingUnits }] : [];
return {
narrowing: [
- { label: instanceType === 'Sonarr' ? 'series' : 'movies', value: funnel.libraryItems },
+ { label: libraryLabel(instanceType), value: funnel.libraryItems },
{ label: 'released', value: funnel.releasedItems },
{ label: 'monitored', value: funnel.monitoredItems },
{ label: 'tag filtered', value: funnel.tagFilteredItems },
diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html b/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html
index e471c0c3..188912b8 100644
--- a/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html
+++ b/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html
@@ -54,7 +54,7 @@
-
+
Cycle Progress
diff --git a/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts b/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts
index d23e008e..17e4e194 100644
--- a/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts
+++ b/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts
@@ -234,6 +234,7 @@ describe('UpgradesTabComponent', () => {
expect(component.itemTypeSeverity('Sonarr')).toBe('info');
expect(component.itemTypeSeverity('Radarr')).toBe('info');
expect(component.itemTypeSeverity('Whisparr')).toBe('info');
+ expect(component.itemTypeSeverity('Lidarr')).toBe('info');
});
it('toasts the error message when loading upgrades fails', () => {
diff --git a/code/frontend/src/app/features/settings/seeker/seeker.component.html b/code/frontend/src/app/features/settings/seeker/seeker.component.html
index 22c2e83d..f3711633 100644
--- a/code/frontend/src/app/features/settings/seeker/seeker.component.html
+++ b/code/frontend/src/app/features/settings/seeker/seeker.component.html
@@ -96,6 +96,9 @@
@if (instance.instanceType === 'Whisparr') {
}
+ @if (instance.instanceType === 'Lidarr') {
+
+ }
diff --git a/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts b/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts
index d44c1132..94046cd5 100644
--- a/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts
+++ b/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts
@@ -545,6 +545,16 @@ describe('SeekerComponent', () => {
expect(fixture.nativeElement.textContent).not.toContain('Search Mode');
});
+ it('marks a Lidarr row as new and shows no release gate or search mode', () => {
+ const lidarr: SeekerInstanceConfig = { ...RADARR, instanceName: 'Lidarr', instanceType: 'Lidarr', enabled: true };
+ const { fixture } = setup({ config: { ...CONFIG, instances: [lidarr] } });
+
+ const badge = fixture.nativeElement.querySelector('.instance-row__info app-new-badge') as HTMLElement;
+ expect(badge.getAttribute('featureId')).toBe('seeker-lidarr');
+ expect(releaseGateSelect(fixture, 0)).toBeUndefined();
+ expect(fixture.nativeElement.textContent).not.toContain('Search Mode');
+ });
+
it('sends the picked release gate for the Radarr row only', () => {
const { fixture, updateConfig } = setup();
diff --git a/code/frontend/src/app/shared/utils/instance-display.util.spec.ts b/code/frontend/src/app/shared/utils/instance-display.util.spec.ts
index 5de0d8ba..6907304d 100644
--- a/code/frontend/src/app/shared/utils/instance-display.util.spec.ts
+++ b/code/frontend/src/app/shared/utils/instance-display.util.spec.ts
@@ -21,6 +21,7 @@ describe('instanceTypeHighlight', () => {
[InstanceType.Radarr, 'info'],
[InstanceType.Sonarr, 'info'],
[InstanceType.Whisparr, 'info'],
+ [InstanceType.Lidarr, 'info'],
])('maps %s to %s', (type, expected) => {
expect(instanceTypeHighlight(type)).toBe(expected);
});
diff --git a/code/frontend/src/app/shared/utils/instance-display.util.ts b/code/frontend/src/app/shared/utils/instance-display.util.ts
index d6a7835d..bb36865f 100644
--- a/code/frontend/src/app/shared/utils/instance-display.util.ts
+++ b/code/frontend/src/app/shared/utils/instance-display.util.ts
@@ -18,6 +18,7 @@ export function instanceTypeHighlight(type: string): BadgeSeverity {
case InstanceType.Radarr:
case InstanceType.Sonarr:
case InstanceType.Whisparr:
+ case InstanceType.Lidarr:
return 'info';
default:
return 'default';