mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-13 16:52:56 -07:00
Added the availablility checker #2313 !wip
This commit is contained in:
parent
5df232f3f5
commit
82d610e235
14 changed files with 148 additions and 16 deletions
|
@ -20,8 +20,8 @@ namespace Ombi.Notifications.Agents
|
|||
{
|
||||
public DiscordNotification(IDiscordApi api, ISettingsService<DiscordNotificationSettings> sn,
|
||||
ILogger<DiscordNotification> log, INotificationTemplatesRepository r,
|
||||
IMovieRequestRepository m, ITvRequestRepository t, ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub)
|
||||
: base(sn, r, m, t,s,log, sub)
|
||||
IMovieRequestRepository m, ITvRequestRepository t, ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub, IMusicRequestRepository music)
|
||||
: base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
@ -130,12 +130,18 @@ namespace Ombi.Notifications.Agents
|
|||
title = MovieRequest.Title;
|
||||
image = MovieRequest.PosterPath;
|
||||
}
|
||||
else
|
||||
else if (model.RequestType == RequestType.TvShow)
|
||||
{
|
||||
user = TvRequest.RequestedUser.UserAlias;
|
||||
title = TvRequest.ParentRequest.Title;
|
||||
image = TvRequest.ParentRequest.PosterPath;
|
||||
}
|
||||
else if (model.RequestType == RequestType.Album)
|
||||
{
|
||||
user = AlbumRequest.RequestedUser.UserAlias;
|
||||
title = AlbumRequest.Title;
|
||||
image = AlbumRequest.Cover;
|
||||
}
|
||||
var message = $"Hello! The user '{user}' has requested {title} but it could not be added. This has been added into the requests queue and will keep retrying";
|
||||
var notification = new NotificationMessage
|
||||
{
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace Ombi.Notifications.Agents
|
|||
public class EmailNotification : BaseNotification<EmailNotificationSettings>, IEmailNotification
|
||||
{
|
||||
public EmailNotification(ISettingsService<EmailNotificationSettings> settings, INotificationTemplatesRepository r, IMovieRequestRepository m, ITvRequestRepository t, IEmailProvider prov, ISettingsService<CustomizationSettings> c,
|
||||
ILogger<EmailNotification> log, UserManager<OmbiUser> um, IRepository<RequestSubscription> sub) : base(settings, r, m, t, c, log, sub)
|
||||
ILogger<EmailNotification> log, UserManager<OmbiUser> um, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(settings, r, m, t, c, log, sub, music)
|
||||
{
|
||||
EmailProvider = prov;
|
||||
Logger = log;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Ombi.Notifications.Agents
|
|||
public class MattermostNotification : BaseNotification<MattermostNotificationSettings>, IMattermostNotification
|
||||
{
|
||||
public MattermostNotification(IMattermostApi api, ISettingsService<MattermostNotificationSettings> sn, ILogger<MattermostNotification> log, INotificationTemplatesRepository r, IMovieRequestRepository m, ITvRequestRepository t,
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub) : base(sn, r, m, t,s,log, sub)
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace Ombi.Notifications.Agents
|
|||
{
|
||||
public MobileNotification(IOneSignalApi api, ISettingsService<MobileNotificationSettings> sn, ILogger<MobileNotification> log, INotificationTemplatesRepository r,
|
||||
IMovieRequestRepository m, ITvRequestRepository t, ISettingsService<CustomizationSettings> s, IRepository<NotificationUserId> notification,
|
||||
UserManager<OmbiUser> um, IRepository<RequestSubscription> sub) : base(sn, r, m, t, s,log, sub)
|
||||
UserManager<OmbiUser> um, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
_api = api;
|
||||
_logger = log;
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace Ombi.Notifications.Agents
|
|||
public class PushbulletNotification : BaseNotification<PushbulletSettings>, IPushbulletNotification
|
||||
{
|
||||
public PushbulletNotification(IPushbulletApi api, ISettingsService<PushbulletSettings> sn, ILogger<PushbulletNotification> log, INotificationTemplatesRepository r, IMovieRequestRepository m, ITvRequestRepository t,
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub) : base(sn, r, m, t,s,log, sub)
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
|
|
@ -18,7 +18,7 @@ namespace Ombi.Notifications.Agents
|
|||
public class PushoverNotification : BaseNotification<PushoverSettings>, IPushoverNotification
|
||||
{
|
||||
public PushoverNotification(IPushoverApi api, ISettingsService<PushoverSettings> sn, ILogger<PushoverNotification> log, INotificationTemplatesRepository r, IMovieRequestRepository m, ITvRequestRepository t,
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub) : base(sn, r, m, t, s, log, sub)
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
|
|
@ -18,7 +18,7 @@ namespace Ombi.Notifications.Agents
|
|||
public class SlackNotification : BaseNotification<SlackNotificationSettings>, ISlackNotification
|
||||
{
|
||||
public SlackNotification(ISlackApi api, ISettingsService<SlackNotificationSettings> sn, ILogger<SlackNotification> log, INotificationTemplatesRepository r, IMovieRequestRepository m, ITvRequestRepository t,
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub) : base(sn, r, m, t, s, log, sub)
|
||||
ISettingsService<CustomizationSettings> s, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t, s, log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace Ombi.Notifications.Agents
|
|||
public TelegramNotification(ITelegramApi api, ISettingsService<TelegramSettings> sn, ILogger<TelegramNotification> log,
|
||||
INotificationTemplatesRepository r, IMovieRequestRepository m,
|
||||
ITvRequestRepository t, ISettingsService<CustomizationSettings> s
|
||||
, IRepository<RequestSubscription> sub) : base(sn, r, m, t,s,log, sub)
|
||||
, IRepository<RequestSubscription> sub, IMusicRequestRepository music) : base(sn, r, m, t,s,log, sub, music)
|
||||
{
|
||||
Api = api;
|
||||
Logger = log;
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace Ombi.Notifications.Interfaces
|
|||
public abstract class BaseNotification<T> : INotification where T : Settings.Settings.Models.Settings, new()
|
||||
{
|
||||
protected BaseNotification(ISettingsService<T> settings, INotificationTemplatesRepository templateRepo, IMovieRequestRepository movie, ITvRequestRepository tv,
|
||||
ISettingsService<CustomizationSettings> customization, ILogger<BaseNotification<T>> log, IRepository<RequestSubscription> sub)
|
||||
ISettingsService<CustomizationSettings> customization, ILogger<BaseNotification<T>> log, IRepository<RequestSubscription> sub, IMusicRequestRepository album)
|
||||
{
|
||||
Settings = settings;
|
||||
TemplateRepository = templateRepo;
|
||||
|
@ -30,12 +30,14 @@ namespace Ombi.Notifications.Interfaces
|
|||
CustomizationSettings.ClearCache();
|
||||
RequestSubscription = sub;
|
||||
_log = log;
|
||||
AlbumRepository = album;
|
||||
}
|
||||
|
||||
protected ISettingsService<T> Settings { get; }
|
||||
protected INotificationTemplatesRepository TemplateRepository { get; }
|
||||
protected IMovieRequestRepository MovieRepository { get; }
|
||||
protected ITvRequestRepository TvRepository { get; }
|
||||
protected IMusicRequestRepository AlbumRepository { get; }
|
||||
protected CustomizationSettings Customization { get; set; }
|
||||
protected IRepository<RequestSubscription> RequestSubscription { get; set; }
|
||||
private ISettingsService<CustomizationSettings> CustomizationSettings { get; }
|
||||
|
@ -43,6 +45,7 @@ namespace Ombi.Notifications.Interfaces
|
|||
|
||||
|
||||
protected ChildRequests TvRequest { get; set; }
|
||||
protected AlbumRequest AlbumRequest { get; set; }
|
||||
protected MovieRequests MovieRequest { get; set; }
|
||||
protected IQueryable<OmbiUser> SubsribedUsers { get; private set; }
|
||||
|
||||
|
@ -130,10 +133,14 @@ namespace Ombi.Notifications.Interfaces
|
|||
{
|
||||
MovieRequest = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == requestId);
|
||||
}
|
||||
else
|
||||
else if (type == RequestType.TvShow)
|
||||
{
|
||||
TvRequest = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == requestId);
|
||||
}
|
||||
else if (type == RequestType.Album)
|
||||
{
|
||||
AlbumRequest = await AlbumRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == requestId);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<T> GetConfiguration()
|
||||
|
@ -181,11 +188,16 @@ namespace Ombi.Notifications.Interfaces
|
|||
|
||||
curlys.Setup(model, MovieRequest, Customization);
|
||||
}
|
||||
else
|
||||
else if (model.RequestType == RequestType.TvShow)
|
||||
{
|
||||
_log.LogDebug("Notification options: {@model}, Req: {@TvRequest}, Settings: {@Customization}", model, TvRequest, Customization);
|
||||
curlys.Setup(model, TvRequest, Customization);
|
||||
}
|
||||
else if (model.RequestType == RequestType.Album)
|
||||
{
|
||||
_log.LogDebug("Notification options: {@model}, Req: {@AlbumRequest}, Settings: {@Customization}", model, AlbumRequest, Customization);
|
||||
curlys.Setup(model, AlbumRequest, Customization);
|
||||
}
|
||||
var parsed = resolver.ParseMessage(template, curlys);
|
||||
|
||||
return parsed;
|
||||
|
|
|
@ -47,14 +47,48 @@ namespace Ombi.Notifications
|
|||
|
||||
if (req?.RequestType == RequestType.Movie)
|
||||
{
|
||||
PosterImage = string.Format((req?.PosterPath ?? string.Empty).StartsWith("/", StringComparison.InvariantCultureIgnoreCase)
|
||||
PosterImage = string.Format((req?.PosterPath ?? string.Empty).StartsWith("/", StringComparison.InvariantCultureIgnoreCase)
|
||||
? "https://image.tmdb.org/t/p/w300{0}" : "https://image.tmdb.org/t/p/w300/{0}", req?.PosterPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosterImage = req?.PosterPath;
|
||||
}
|
||||
|
||||
|
||||
AdditionalInformation = opts?.AdditionalInformation ?? string.Empty;
|
||||
}
|
||||
|
||||
public void Setup(NotificationOptions opts, AlbumRequest req, CustomizationSettings s)
|
||||
{
|
||||
LoadIssues(opts);
|
||||
string title;
|
||||
if (req == null)
|
||||
{
|
||||
opts.Substitutes.TryGetValue("Title", out title);
|
||||
}
|
||||
else
|
||||
{
|
||||
title = req?.Title;
|
||||
}
|
||||
ApplicationUrl = (s?.ApplicationUrl.HasValue() ?? false) ? s.ApplicationUrl : string.Empty;
|
||||
ApplicationName = string.IsNullOrEmpty(s?.ApplicationName) ? "Ombi" : s?.ApplicationName;
|
||||
RequestedUser = req?.RequestedUser?.UserName;
|
||||
if (UserName.IsNullOrEmpty())
|
||||
{
|
||||
// Can be set if it's an issue
|
||||
UserName = req?.RequestedUser?.UserName;
|
||||
}
|
||||
|
||||
Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName;
|
||||
Title = title;
|
||||
RequestedDate = req?.RequestedDate.ToString("D");
|
||||
if (Type.IsNullOrEmpty())
|
||||
{
|
||||
Type = req?.RequestType.Humanize();
|
||||
}
|
||||
Year = req?.ReleaseDate.Year.ToString();
|
||||
PosterImage = (req?.Cover.HasValue() ?? false) ? req.Cover : req?.Disk ?? string.Empty;
|
||||
|
||||
AdditionalInformation = opts?.AdditionalInformation ?? string.Empty;
|
||||
}
|
||||
|
||||
|
|
73
src/Ombi.Schedule/Jobs/Lidarr/LidarrAvailabilityChecker.cs
Normal file
73
src/Ombi.Schedule/Jobs/Lidarr/LidarrAvailabilityChecker.cs
Normal file
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Hangfire;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Ombi.Core.Notifications;
|
||||
using Ombi.Helpers;
|
||||
using Ombi.Notifications.Models;
|
||||
using Ombi.Store.Entities;
|
||||
using Ombi.Store.Entities.Requests;
|
||||
using Ombi.Store.Repository;
|
||||
using Ombi.Store.Repository.Requests;
|
||||
|
||||
namespace Ombi.Schedule.Jobs.Lidarr
|
||||
{
|
||||
public class LidarrAvailabilityChecker
|
||||
{
|
||||
public LidarrAvailabilityChecker(IMusicRequestRepository requests, IRepository<LidarrAlbumCache> albums, ILogger<LidarrAvailabilityChecker> log,
|
||||
IBackgroundJobClient job, INotificationService notification)
|
||||
{
|
||||
_cachedAlbums = albums;
|
||||
_requestRepository = requests;
|
||||
_logger = log;
|
||||
_job = job;
|
||||
_notificationService = notification;
|
||||
}
|
||||
|
||||
private readonly IMusicRequestRepository _requestRepository;
|
||||
private readonly IRepository<LidarrAlbumCache> _cachedAlbums;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IBackgroundJobClient _job;
|
||||
private readonly INotificationService _notificationService;
|
||||
|
||||
public async Task Start()
|
||||
{
|
||||
var allAlbumRequests = _requestRepository.GetAll().Include(x => x.RequestedUser).Where(x => !x.Available);
|
||||
var albumsToUpdate = new List<AlbumRequest>();
|
||||
foreach (var request in allAlbumRequests)
|
||||
{
|
||||
// Check if we have it cached
|
||||
var cachedAlbum = await _cachedAlbums.FirstOrDefaultAsync(x => x.ForeignAlbumId.Equals(request.ForeignAlbumId));
|
||||
if (cachedAlbum != null)
|
||||
{
|
||||
if (cachedAlbum.Monitored && cachedAlbum.FullyAvailable)
|
||||
{
|
||||
request.Available = true;
|
||||
request.MarkedAsAvailable = DateTime.Now;
|
||||
albumsToUpdate.Add(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var albumRequest in albumsToUpdate)
|
||||
{
|
||||
await _requestRepository.Update(albumRequest);
|
||||
var recipient = albumRequest.RequestedUser.Email.HasValue() ? albumRequest.RequestedUser.Email : string.Empty;
|
||||
|
||||
_logger.LogDebug("AlbumId: {0}, RequestUser: {1}", albumRequest.Id, recipient);
|
||||
|
||||
_job.Enqueue(() => _notificationService.Publish(new NotificationOptions
|
||||
{
|
||||
DateTime = DateTime.Now,
|
||||
NotificationType = NotificationType.RequestAvailable,
|
||||
RequestId = albumRequest.Id,
|
||||
RequestType = RequestType.Album,
|
||||
Recipient = recipient,
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,5 +13,10 @@ namespace Ombi.Store.Entities
|
|||
public bool Monitored { get; set; }
|
||||
public string Title { get; set; }
|
||||
public decimal PercentOfTracks { get; set; }
|
||||
|
||||
[NotMapped]
|
||||
public bool PartiallyAvailable => PercentOfTracks != 100 && PercentOfTracks > 0;
|
||||
[NotMapped]
|
||||
public bool FullyAvailable => PercentOfTracks == 100;
|
||||
}
|
||||
}
|
|
@ -51,7 +51,7 @@
|
|||
<a *ngIf="result.showSubscribe && result.subscribed" style="color:red" (click)="unSubscribe(result)" pTooltip="Unsubscribe notification"> <i class="fa fa-rss"></i></a> -->
|
||||
</div>
|
||||
</div>
|
||||
<button style="text-align: right" class="btn btn-info-outline" (click)="viewAllAlbums()">
|
||||
<button style="text-align: right" class="btn btn-info-outline" [disabled]="searchingAlbums" (click)="viewAllAlbums()">
|
||||
<i class="fa fa-eye"></i> View Albums</button>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -11,6 +11,7 @@ export class ArtistSearchComponent {
|
|||
|
||||
@Input() public result: ISearchArtistResult;
|
||||
@Input() public defaultPoster: string;
|
||||
public searchingAlbums: boolean;
|
||||
|
||||
@Output() public viewAlbumsResult = new EventEmitter<ISearchAlbumResult[]>();
|
||||
|
||||
|
@ -18,6 +19,7 @@ export class ArtistSearchComponent {
|
|||
}
|
||||
|
||||
public viewAllAlbums() {
|
||||
this.searchingAlbums = true;
|
||||
this.searchService.getAlbumsForArtist(this.result.forignArtistId).subscribe(x => {
|
||||
this.viewAlbumsResult.emit(x);
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue