public async Task Execute(IJobExecutionContext job) { try { var s = await _settings.GetSettingsAsync(); if (!s.Enable) { return; } await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Plex Episode Sync Started"); foreach (var server in s.Servers) { await Cache(server); } } catch (Exception e) { await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Plex Episode Sync Failed"); _log.LogError(LoggingEvents.Cacher, e, "Caching Episodes Failed"); } _log.LogInformation("Plex Episode Sync Finished - Triggering Metadata refresh"); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Plex Episode Sync Finished"); }
public async Task Notify(NotificationOptions model) { await OmbiQuartz.TriggerJob(nameof(INotificationService), "Notifications", new Dictionary <string, object> { { JobDataKeys.NotificationOptions, model } }); }
public async Task Execute(IJobExecutionContext job) { var embySettings = await _settings.GetSettingsAsync(); if (!embySettings.Enable) { return; } foreach (var server in embySettings.Servers) { try { await StartServerCache(server, embySettings); } catch (Exception e) { _logger.LogError(e, "Exception when caching {1} for server {0}", server.Name, embySettings.IsJellyfin ? "Jellyfin" : "Emby"); } } // Episodes await OmbiQuartz.TriggerJob(nameof(IEmbyEpisodeSync), "Emby"); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); }
public async Task Execute(IJobExecutionContext job) { await ProcessMovies(); await ProcessTv(); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); }
public async Task Execute(IJobExecutionContext job) { var jellyfinSettings = await _settings.GetSettingsAsync(); if (!jellyfinSettings.Enable) { return; } Api = _apiFactory.CreateClient(jellyfinSettings); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Jellyfin Content Sync Started"); foreach (var server in jellyfinSettings.Servers) { try { await StartServerCache(server); } catch (Exception e) { await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Jellyfin Content Sync Failed"); _logger.LogError(e, "Exception when caching Jellyfin for server {0}", server.Name); } } await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Jellyfin Content Sync Finished"); // Episodes await OmbiQuartz.TriggerJob(nameof(IJellyfinEpisodeSync), "Jellyfin"); }
public async Task ProcessPlexServerContent(IEnumerable <int> contentIds) { _log.LogInformation("Starting the Metadata refresh from RecentlyAddedSync"); var plexSettings = await _plexSettings.GetSettingsAsync(); var embySettings = await _embySettings.GetSettingsAsync(); try { if (plexSettings.Enable) { await StartPlexWithKnownContent(contentIds); } } catch (Exception e) { _log.LogError(e, "Exception when refreshing the Plex Metadata"); throw; } finally { if (plexSettings.Enable) { await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); } if (embySettings.Enable) { await OmbiQuartz.TriggerJob(nameof(IEmbyAvaliabilityChecker), "Emby"); } } }
public async Task Execute(IJobExecutionContext job) { try { var s = await _settings.GetSettingsAsync(); if (!s.Enable) { return; } foreach (var server in s.Servers) { await Cache(server); } } catch (Exception e) { _log.LogError(LoggingEvents.Cacher, e, "Caching Episodes Failed"); } await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); }
public async Task Execute(IJobExecutionContext job) { var settings = await _settings.GetSettingsAsync(); Api = _apiFactory.CreateClient(settings); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Started"); foreach (var server in settings.Servers) { if (server.EmbySelectedLibraries.Any() && server.EmbySelectedLibraries.Any(x => x.Enabled)) { var tvLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "tvshows"); foreach (var tvParentIdFilter in tvLibsToFilter) { _logger.LogInformation($"Scanning Lib for episodes '{tvParentIdFilter.Title}'"); await CacheEpisodes(server, tvParentIdFilter.Key); } } else { await CacheEpisodes(server, string.Empty); } } await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Finished"); _logger.LogInformation("Emby Episode Sync Finished - Triggering Metadata refresh"); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); }
private async Task Process(RadarrSettings settings) { if (settings.Enabled) { try { var movies = await _api.GetMovies(settings.ApiKey, settings.FullUri); var existingMovies = _radarrRepo.GetAll(); if (movies != null) { var movieIds = new List <RadarrCache>(); foreach (var m in movies) { if (m.monitored || m.hasFile) { if (m.tmdbId > 0) { var is4k = m.movieFile?.quality?.quality?.resolution >= 2160; // Do we have a cached movie for this already? var existing = await existingMovies.FirstOrDefaultAsync(x => x.TheMovieDbId == m.tmdbId); if (existing != null) { existing.Has4K = is4k; existing.HasFile = m.hasFile; } else { movieIds.Add(new RadarrCache { TheMovieDbId = m.tmdbId, HasFile = m.hasFile, Has4K = is4k, HasRegular = !is4k }); } } else { _logger.LogError($"TMDBId is not > 0 for movie {m.title}"); } } } // Save from the updates made to the existing movies (they are in the EF Change Tracker) await _radarrRepo.SaveChangesAsync(); await _radarrRepo.AddRange(movieIds); } await OmbiQuartz.TriggerJob(nameof(IArrAvailabilityChecker), "DVR"); } catch (System.Exception ex) { _logger.LogError(LoggingEvents.Cacher, ex, "Failed caching queued items from Radarr"); } } }
public async Task <bool> LidarrSettings([FromBody] LidarrSettings settings) { var lidarr = await Save(settings); if (lidarr) { await OmbiQuartz.TriggerJob(nameof(ILidarrArtistSync), "DVR"); } return(lidarr); }
public async Task <bool> SonarrSettings([FromBody] SonarrSettings settings) { var result = await Save(settings); if (result) { await OmbiQuartz.TriggerJob(nameof(ISonarrSync), "DVR"); } return(result); }
public async Task Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; var recentlyAddedSearch = dataMap.GetBooleanValueFromString("recentlyAddedSearch"); var plexSettings = await Plex.GetSettingsAsync(); if (!plexSettings.Enable) { return; } if (!ValidateSettings(plexSettings)) { Logger.LogError("Plex Settings are not valid"); return; } var processedContent = new ProcessedContent(); Logger.LogInformation("Starting Plex Content Cacher"); try { if (recentlyAddedSearch) { processedContent = await StartTheCache(plexSettings, true); } else { await StartTheCache(plexSettings, false); } } catch (Exception e) { Logger.LogWarning(LoggingEvents.PlexContentCacher, e, "Exception thrown when attempting to cache the Plex Content"); } if (!recentlyAddedSearch) { Logger.LogInformation("Starting EP Cacher"); await OmbiQuartz.TriggerJob(nameof(IPlexEpisodeSync), "Plex"); } if ((processedContent?.HasProcessedContent ?? false) && recentlyAddedSearch) { // Just check what we send it await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); } if ((processedContent?.HasProcessedContent ?? false) && recentlyAddedSearch) { await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); } Logger.LogInformation("Finished Plex Content Cacher, with processed content: {0}, episodes: {0}", processedContent.Content.Count(), processedContent.Episodes.Count()); }
public async Task Execute(IJobExecutionContext job) { var settings = await _settings.GetSettingsAsync(); foreach (var server in settings.Servers) { await CacheEpisodes(server); } await OmbiQuartz.TriggerJob(nameof(IEmbyAvaliabilityChecker), "Emby"); }
public async Task Execute(IJobExecutionContext job) { _log.LogInformation("Starting the Metadata refresh"); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Metadata Refresh Started"); try { var settings = await _plexSettings.GetSettingsAsync(); if (settings.Enable) { await StartPlex(); await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); } var embySettings = await _embySettings.GetSettingsAsync(); if (embySettings.Enable) { await StartEmby(embySettings); await OmbiQuartz.TriggerJob(nameof(IEmbyAvaliabilityChecker), "Emby"); } var jellyfinSettings = await _jellyfinSettings.GetSettingsAsync(); if (jellyfinSettings.Enable) { await StartJellyfin(jellyfinSettings); await OmbiQuartz.TriggerJob(nameof(IJellyfinAvaliabilityChecker), "Jellyfin"); } } catch (Exception e) { _log.LogError(e, $"Exception when refreshing the Metadata Refresh"); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Metadata Refresh Failed"); return; } await _mediaCacheService.Purge(); _log.LogInformation("Metadata refresh finished"); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Metadata Refresh Finished"); }
public async Task <bool> RadarrSettings([FromBody] RadarrSettings settings) { var result = await Save(settings); if (result) { _cache.Remove(CacheKeys.RadarrRootProfiles); _cache.Remove(CacheKeys.RadarrQualityProfiles); await OmbiQuartz.TriggerJob(nameof(IRadarrSync), "DVR"); } return(result); }
public async Task NewRequest(AlbumRequest model) { var notificationModel = new NotificationOptions { RequestId = model.Id, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest, RequestType = model.RequestType }; await OmbiQuartz.TriggerJob(nameof(INotificationService), "Notifications", new Dictionary <string, object> { { JobDataKeys.NotificationOptions, notificationModel } }); }
public async Task Notify(ChildRequests model, NotificationType type) { var notificationModel = new NotificationOptions { RequestId = model.Id, DateTime = DateTime.Now, NotificationType = type, RequestType = model.RequestType, Recipient = model.RequestedUser?.Email ?? string.Empty }; await OmbiQuartz.TriggerJob(nameof(INotificationService), "Notifications", new Dictionary <string, object> { { JobDataKeys.NotificationOptions, notificationModel } }); }
public async Task <bool> PlexSettings([FromBody] PlexSettings plex) { if (plex?.InstallId == Guid.Empty || plex.InstallId == Guid.Empty) { plex.InstallId = Guid.NewGuid(); } var result = await Save(plex); if (result) { // Kick off the plex sync await OmbiQuartz.TriggerJob(nameof(IPlexContentSync), "Plex"); } return(result); }
public async Task Execute(IJobExecutionContext job) { var settings = await _settings.GetSettingsAsync(); Api = _apiFactory.CreateClient(settings); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Started"); foreach (var server in settings.Servers) { await CacheEpisodes(server); } await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Finished"); _logger.LogInformation("Emby Episode Sync Finished - Triggering Metadata refresh"); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); }
public async Task <bool> EmbySettings([FromBody] EmbySettings emby) { if (emby.Enable) { var client = await _embyApi.CreateClient(); foreach (var server in emby.Servers) { var users = await client.GetUsers(server.FullUri, server.ApiKey); var admin = users.FirstOrDefault(x => x.Policy.IsAdministrator); server.AdministratorId = admin?.Id; } } var result = await Save(emby); if (result) { await OmbiQuartz.TriggerJob(nameof(IEmbyContentSync), "Emby"); } return(result); }
public async Task <bool> JellyfinSettings([FromBody] JellyfinSettings jellyfin) { if (jellyfin.Enable) { var client = await _jellyfinApi.CreateClient(); foreach (var server in jellyfin.Servers) { var users = await client.GetUsers(server.FullUri, server.ApiKey); var admin = users.FirstOrDefault(x => x.Policy.IsAdministrator); server.AdministratorId = admin?.Id; } } var result = await Save(jellyfin); if (result) { await OmbiQuartz.TriggerJob(nameof(IJellyfinContentSync), "Jellyfin"); } return(result); }
public async Task Execute(IJobExecutionContext context) { JobDataMap dataMap = context.MergedJobDataMap; var recentlyAddedSearch = false; if (dataMap.TryGetValue(JobDataKeys.EmbyRecentlyAddedSearch, out var recentlyAddedObj)) { recentlyAddedSearch = Convert.ToBoolean(recentlyAddedObj); } var settings = await _settings.GetSettingsAsync(); Api = _apiFactory.CreateClient(settings); await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Started"); foreach (var server in settings.Servers) { if (server.EmbySelectedLibraries.Any() && server.EmbySelectedLibraries.Any(x => x.Enabled)) { var tvLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "tvshows"); foreach (var tvParentIdFilter in tvLibsToFilter) { _logger.LogInformation($"Scanning Lib for episodes '{tvParentIdFilter.Title}'"); await CacheEpisodes(server, recentlyAddedSearch, tvParentIdFilter.Key); } } else { await CacheEpisodes(server, recentlyAddedSearch, string.Empty); } } await _notification.Clients.Clients(NotificationHub.AdminConnectionIds) .SendAsync(NotificationHub.NotificationEvent, "Emby Episode Sync Finished"); _logger.LogInformation("Emby Episode Sync Finished - Triggering Metadata refresh"); await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System"); }
private async Task RemoveJellyfinData() { try { var s = await _settings.GetSettingsAsync(); if (!s.Enable) { return; } const string episodeSQL = "DELETE FROM JellyfinEpisode"; const string mainSql = "DELETE FROM JellyfinContent"; await _jellyfinRepo.ExecuteSql(episodeSQL); await _jellyfinRepo.ExecuteSql(mainSql); await OmbiQuartz.TriggerJob(nameof(IJellyfinContentSync), "Jellyfin"); } catch (Exception e) { _log.LogError(LoggingEvents.MediaReferesh, e, "Refreshing Jellyfin Data Failed"); } }
public async Task <bool> EmbyUserImporter() { await OmbiQuartz.TriggerJob(nameof(IEmbyUserImporter), "Emby"); return(true); }
public async Task <bool> ForceUpdate() { await OmbiQuartz.TriggerJob(nameof(IOmbiAutomaticUpdater), "System"); return(true); }
public async Task Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; var recentlyAddedSearch = dataMap.GetBooleanValueFromString(JobDataKeys.RecentlyAddedSearch); var plexSettings = await Plex.GetSettingsAsync(); if (!plexSettings.Enable) { return; } await NotifyClient(recentlyAddedSearch? "Plex Recently Added Sync Started" : "Plex Content Sync Started"); if (!ValidateSettings(plexSettings)) { Logger.LogError("Plex Settings are not valid"); await NotifyClient(recentlyAddedSearch? "Plex Recently Added Sync, Settings Not Valid" : "Plex Content, Settings Not Valid"); return; } var processedContent = new ProcessedContent(); Logger.LogInformation(recentlyAddedSearch ? "Starting Plex Content Cacher Recently Added Scan" : "Starting Plex Content Cacher"); try { if (recentlyAddedSearch) { processedContent = await StartTheCache(plexSettings, true); } else { await StartTheCache(plexSettings, false); } } catch (Exception e) { await NotifyClient(recentlyAddedSearch? "Plex Recently Added Sync Errored" : "Plex Content Sync Errored"); Logger.LogWarning(LoggingEvents.PlexContentCacher, e, "Exception thrown when attempting to cache the Plex Content"); } if (!recentlyAddedSearch) { await NotifyClient("Plex Sync - Starting Episode Sync"); Logger.LogInformation("Starting EP Cacher"); await OmbiQuartz.TriggerJob(nameof(IPlexEpisodeSync), "Plex"); } if ((processedContent?.HasProcessedContent ?? false) && recentlyAddedSearch) { await NotifyClient("Plex Sync - Checking if any requests are now available"); Logger.LogInformation("Kicking off Plex Availability Checker"); await _mediaCacheService.Purge(); await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); } var processedCont = processedContent?.Content?.Count() ?? 0; var processedEp = processedContent?.Episodes?.Count() ?? 0; Logger.LogInformation("Finished Plex Content Cacher, with processed content: {0}, episodes: {1}. Recently Added Scan: {2}", processedCont, processedEp, recentlyAddedSearch); await NotifyClient(recentlyAddedSearch?$"Plex Recently Added Sync Finished, We processed {processedCont}, and {processedEp} Episodes" : "Plex Content Sync Finished"); }
public async Task <bool> PlexUserImporter() { await OmbiQuartz.TriggerJob(nameof(IPlexUserImporter), "Plex"); return(true); }
public async Task Execute(IJobExecutionContext job) { await SemaphoreSlim.WaitAsync(); try { var settings = await RadarrSettings.GetSettingsAsync(); if (settings.Enabled) { try { var movies = await RadarrApi.GetMovies(settings.ApiKey, settings.FullUri); if (movies != null) { var strat = _ctx.Database.CreateExecutionStrategy(); await strat.ExecuteAsync(async() => { // Let's remove the old cached data using (var tran = await _ctx.Database.BeginTransactionAsync()) { await _ctx.Database.ExecuteSqlRawAsync("DELETE FROM RadarrCache"); tran.Commit(); } }); var movieIds = new List <RadarrCache>(); foreach (var m in movies) { if (m.monitored || m.hasFile) { if (m.tmdbId > 0) { movieIds.Add(new RadarrCache { TheMovieDbId = m.tmdbId, HasFile = m.hasFile }); } else { Logger.LogError("TMDBId is not > 0 for movie {0}", m.title); } } } strat = _ctx.Database.CreateExecutionStrategy(); await strat.ExecuteAsync(async() => { using (var tran = await _ctx.Database.BeginTransactionAsync()) { await _ctx.RadarrCache.AddRangeAsync(movieIds); await _ctx.SaveChangesAsync(); tran.Commit(); } }); } await OmbiQuartz.TriggerJob(nameof(IArrAvailabilityChecker), "DVR"); } catch (System.Exception ex) { Logger.LogError(LoggingEvents.Cacher, ex, "Failed caching queued items from Radarr"); } } } catch (Exception) { Logger.LogInformation(LoggingEvents.RadarrCacher, "Radarr is not setup, cannot cache episodes"); } finally { SemaphoreSlim.Release(); } }
public async Task <bool> StartNewsletter() { await OmbiQuartz.TriggerJob(nameof(INewsletterJob), "System"); return(true); }
public async Task Execute(IJobExecutionContext job) { try { var settings = await _settings.GetSettingsAsync(); if (!settings.Enabled) { return; } var series = await _api.GetSeries(settings.ApiKey, settings.FullUri); if (series != null) { var sonarrSeries = series as ImmutableHashSet <SonarrSeries> ?? series.ToImmutableHashSet(); var ids = sonarrSeries.Select(x => new SonarrDto { TvDbId = x.tvdbId, ImdbId = x.imdbId, Title = x.title, MovieDbId = 0, Id = x.id, Monitored = x.monitored, EpisodeFileCount = x.episodeFileCount }).ToHashSet(); var strat = _ctx.Database.CreateExecutionStrategy(); await strat.ExecuteAsync(async() => { using (var tran = await _ctx.Database.BeginTransactionAsync()) { await _ctx.Database.ExecuteSqlRawAsync("DELETE FROM SonarrCache"); tran.Commit(); } }); var existingSeries = await _ctx.SonarrCache.Select(x => x.TvDbId).ToListAsync(); var sonarrCacheToSave = new HashSet <SonarrCache>(); foreach (var id in ids) { var cache = new SonarrCache { TvDbId = id.TvDbId }; var findResult = await _movieDbApi.Find(id.TvDbId.ToString(), ExternalSource.tvdb_id); if (findResult.tv_results.Any()) { cache.TheMovieDbId = findResult.tv_results.FirstOrDefault()?.id ?? -1; id.MovieDbId = cache.TheMovieDbId; } sonarrCacheToSave.Add(cache); } await _ctx.SonarrCache.AddRangeAsync(sonarrCacheToSave); await _ctx.SaveChangesAsync(); sonarrCacheToSave.Clear(); strat = _ctx.Database.CreateExecutionStrategy(); await strat.ExecuteAsync(async() => { using (var tran = await _ctx.Database.BeginTransactionAsync()) { await _ctx.Database.ExecuteSqlRawAsync("DELETE FROM SonarrEpisodeCache"); tran.Commit(); } }); foreach (var s in ids) { if (!s.Monitored || s.EpisodeFileCount == 0) // We have files { continue; } _log.LogDebug("Syncing series: {0}", s.Title); var episodes = await _api.GetEpisodes(s.Id, settings.ApiKey, settings.FullUri); var monitoredEpisodes = episodes.Where(x => x.monitored || x.hasFile); //var allExistingEpisodes = await _ctx.SonarrEpisodeCache.Where(x => x.TvDbId == s.tvdbId).ToListAsync(); // Add to DB _log.LogDebug("We have the episodes, adding to db transaction"); var episodesToAdd = monitoredEpisodes.Select(episode => new SonarrEpisodeCache { EpisodeNumber = episode.episodeNumber, SeasonNumber = episode.seasonNumber, TvDbId = s.TvDbId, MovieDbId = s.MovieDbId, HasFile = episode.hasFile }); //var episodesToAdd = new List<SonarrEpisodeCache>(); //foreach (var monitored in monitoredEpisodes) //{ // var existing = allExistingEpisodes.FirstOrDefault(x => x.SeasonNumber == monitored.seasonNumber && x.EpisodeNumber == monitored.episodeNumber); // if (existing == null) // { // // Just add a new one // episodesToAdd.Add(new SonarrEpisodeCache // { // EpisodeNumber = monitored.episodeNumber, // SeasonNumber = monitored.seasonNumber, // TvDbId = s.tvdbId, // HasFile = monitored.hasFile // }); // } // else // { // // Do we need to update the availability? // if (monitored.hasFile != existing.HasFile) // { // existing.HasFile = monitored.hasFile; // } // } //} strat = _ctx.Database.CreateExecutionStrategy(); await strat.ExecuteAsync(async() => { using (var tran = await _ctx.Database.BeginTransactionAsync()) { await _ctx.SonarrEpisodeCache.AddRangeAsync(episodesToAdd); _log.LogDebug("Commiting the transaction"); await _ctx.SaveChangesAsync(); tran.Commit(); } }); } } await OmbiQuartz.TriggerJob(nameof(IArrAvailabilityChecker), "DVR"); } catch (Exception e) { _log.LogError(LoggingEvents.SonarrCacher, e, "Exception when trying to cache Sonarr"); } }