Fix notifications failing when poster image is not set (#78)

This commit is contained in:
Flaminel
2025-03-02 22:48:21 +02:00
committed by GitHub
parent 5adbdbd920
commit ba02aa0e49
@@ -32,7 +32,7 @@ public class NotificationPublisher : INotificationPublisher
QueueRecord record = ContextProvider.Get<QueueRecord>(nameof(QueueRecord)); QueueRecord record = ContextProvider.Get<QueueRecord>(nameof(QueueRecord));
InstanceType instanceType = (InstanceType)ContextProvider.Get<object>(nameof(InstanceType)); InstanceType instanceType = (InstanceType)ContextProvider.Get<object>(nameof(InstanceType));
Uri instanceUrl = ContextProvider.Get<Uri>(nameof(ArrInstance) + nameof(ArrInstance.Url)); Uri instanceUrl = ContextProvider.Get<Uri>(nameof(ArrInstance) + nameof(ArrInstance.Url));
Uri imageUrl = GetImageFromContext(record, instanceType); Uri? imageUrl = GetImageFromContext(record, instanceType);
ArrNotification notification = new() ArrNotification notification = new()
{ {
@@ -62,11 +62,13 @@ public class NotificationPublisher : INotificationPublisher
} }
public virtual async Task NotifyQueueItemDeleted(bool removeFromClient, DeleteReason reason) public virtual async Task NotifyQueueItemDeleted(bool removeFromClient, DeleteReason reason)
{
try
{ {
QueueRecord record = ContextProvider.Get<QueueRecord>(nameof(QueueRecord)); QueueRecord record = ContextProvider.Get<QueueRecord>(nameof(QueueRecord));
InstanceType instanceType = (InstanceType)ContextProvider.Get<object>(nameof(InstanceType)); InstanceType instanceType = (InstanceType)ContextProvider.Get<object>(nameof(InstanceType));
Uri instanceUrl = ContextProvider.Get<Uri>(nameof(ArrInstance) + nameof(ArrInstance.Url)); Uri instanceUrl = ContextProvider.Get<Uri>(nameof(ArrInstance) + nameof(ArrInstance.Url));
Uri imageUrl = GetImageFromContext(record, instanceType); Uri? imageUrl = GetImageFromContext(record, instanceType);
QueueItemDeletedNotification notification = new() QueueItemDeletedNotification notification = new()
{ {
@@ -81,8 +83,15 @@ public class NotificationPublisher : INotificationPublisher
await _dryRunInterceptor.InterceptAsync(Notify<QueueItemDeletedNotification>, notification); await _dryRunInterceptor.InterceptAsync(Notify<QueueItemDeletedNotification>, notification);
} }
catch (Exception ex)
{
_logger.LogError(ex, "failed to notify queue item deleted");
}
}
public virtual async Task NotifyDownloadCleaned(double ratio, TimeSpan seedingTime, string categoryName, CleanReason reason) public virtual async Task NotifyDownloadCleaned(double ratio, TimeSpan seedingTime, string categoryName, CleanReason reason)
{
try
{ {
DownloadCleanedNotification notification = new() DownloadCleanedNotification notification = new()
{ {
@@ -93,13 +102,21 @@ public class NotificationPublisher : INotificationPublisher
new() { Title = "Hash", Text = ContextProvider.Get<string>("hash").ToLowerInvariant() }, new() { Title = "Hash", Text = ContextProvider.Get<string>("hash").ToLowerInvariant() },
new() { Title = "Category", Text = categoryName.ToLowerInvariant() }, new() { Title = "Category", Text = categoryName.ToLowerInvariant() },
new() { Title = "Ratio", Text = $"{ratio.ToString(CultureInfo.InvariantCulture)}%" }, new() { Title = "Ratio", Text = $"{ratio.ToString(CultureInfo.InvariantCulture)}%" },
new() { Title = "Seeding hours", Text = $"{Math.Round(seedingTime.TotalHours, 0).ToString(CultureInfo.InvariantCulture)}h" } new()
{
Title = "Seeding hours", Text = $"{Math.Round(seedingTime.TotalHours, 0).ToString(CultureInfo.InvariantCulture)}h"
}
], ],
Level = NotificationLevel.Important Level = NotificationLevel.Important
}; };
await _dryRunInterceptor.InterceptAsync(Notify<DownloadCleanedNotification>, notification); await _dryRunInterceptor.InterceptAsync(Notify<DownloadCleanedNotification>, notification);
} }
catch (Exception ex)
{
_logger.LogError(ex, "failed to notify download cleaned");
}
}
[DryRunSafeguard] [DryRunSafeguard]
private Task Notify<T>(T message) where T: notnull private Task Notify<T>(T message) where T: notnull
@@ -107,12 +124,21 @@ public class NotificationPublisher : INotificationPublisher
return _messageBus.Publish(message); return _messageBus.Publish(message);
} }
private static Uri GetImageFromContext(QueueRecord record, InstanceType instanceType) => private Uri? GetImageFromContext(QueueRecord record, InstanceType instanceType)
instanceType switch {
Uri? image = instanceType switch
{ {
InstanceType.Sonarr => record.Series!.Images.FirstOrDefault(x => x.CoverType == "poster")?.RemoteUrl, InstanceType.Sonarr => record.Series!.Images.FirstOrDefault(x => x.CoverType == "poster")?.RemoteUrl,
InstanceType.Radarr => record.Movie!.Images.FirstOrDefault(x => x.CoverType == "poster")?.RemoteUrl, InstanceType.Radarr => record.Movie!.Images.FirstOrDefault(x => x.CoverType == "poster")?.RemoteUrl,
InstanceType.Lidarr => record.Album!.Images.FirstOrDefault(x => x.CoverType == "cover")?.Url, InstanceType.Lidarr => record.Album!.Images.FirstOrDefault(x => x.CoverType == "cover")?.Url,
_ => throw new ArgumentOutOfRangeException(nameof(instanceType)) _ => throw new ArgumentOutOfRangeException(nameof(instanceType))
} ?? throw new Exception("failed to get image url from context"); };
if (image is null)
{
_logger.LogWarning("no poster found for {title}", record.Title);
}
return image;
}
} }