コード例 #1
0
ファイル: PlexEpisodeSync.cs プロジェクト: Ombi-app/Ombi
        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");
        }
コード例 #2
0
ファイル: NotificationHelper.cs プロジェクト: xCeeTee/Ombi
 public async Task Notify(NotificationOptions model)
 {
     await OmbiQuartz.TriggerJob(nameof(INotificationService), "Notifications", new Dictionary <string, object>
     {
         { JobDataKeys.NotificationOptions, model }
     });
 }
コード例 #3
0
ファイル: EmbyContentSync.cs プロジェクト: zmike808/Ombi
        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");
        }
コード例 #4
0
        public async Task Execute(IJobExecutionContext job)
        {
            await ProcessMovies();
            await ProcessTv();

            await OmbiQuartz.TriggerJob(nameof(IRefreshMetadata), "System");
        }
コード例 #5
0
ファイル: JellyfinContentSync.cs プロジェクト: anojht/Ombi
        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");
        }
コード例 #6
0
ファイル: RefreshMetadata.cs プロジェクト: itzfk0/ombi
        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");
                }
            }
        }
コード例 #7
0
        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");
        }
コード例 #8
0
        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");
        }
コード例 #9
0
        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");
                }
            }
        }
コード例 #10
0
        public async Task <bool> LidarrSettings([FromBody] LidarrSettings settings)
        {
            var lidarr = await Save(settings);

            if (lidarr)
            {
                await OmbiQuartz.TriggerJob(nameof(ILidarrArtistSync), "DVR");
            }
            return(lidarr);
        }
コード例 #11
0
        public async Task <bool> SonarrSettings([FromBody] SonarrSettings settings)
        {
            var result = await Save(settings);

            if (result)
            {
                await OmbiQuartz.TriggerJob(nameof(ISonarrSync), "DVR");
            }
            return(result);
        }
コード例 #12
0
ファイル: PlexContentSync.cs プロジェクト: itzfk0/ombi
        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());
        }
コード例 #13
0
        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");
        }
コード例 #14
0
ファイル: RefreshMetadata.cs プロジェクト: anojht/Ombi
        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");
        }
コード例 #15
0
ファイル: SettingsController.cs プロジェクト: itzfk0/ombi
        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);
        }
コード例 #16
0
ファイル: NotificationHelper.cs プロジェクト: xCeeTee/Ombi
 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 }
     });
 }
コード例 #17
0
ファイル: NotificationHelper.cs プロジェクト: xCeeTee/Ombi
 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 }
     });
 }
コード例 #18
0
        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);
        }
コード例 #19
0
ファイル: EmbyEpisodeSync.cs プロジェクト: sir-marv/Ombi
        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");
        }
コード例 #20
0
        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);
        }
コード例 #21
0
        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);
        }
コード例 #22
0
        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");
        }
コード例 #23
0
        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");
            }
        }
コード例 #24
0
        public async Task <bool> EmbyUserImporter()
        {
            await OmbiQuartz.TriggerJob(nameof(IEmbyUserImporter), "Emby");

            return(true);
        }
コード例 #25
0
        public async Task <bool> ForceUpdate()
        {
            await OmbiQuartz.TriggerJob(nameof(IOmbiAutomaticUpdater), "System");

            return(true);
        }
コード例 #26
0
        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");
        }
コード例 #27
0
        public async Task <bool> PlexUserImporter()
        {
            await OmbiQuartz.TriggerJob(nameof(IPlexUserImporter), "Plex");

            return(true);
        }
コード例 #28
0
        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();
            }
        }
コード例 #29
0
        public async Task <bool> StartNewsletter()
        {
            await OmbiQuartz.TriggerJob(nameof(INewsletterJob), "System");

            return(true);
        }
コード例 #30
0
ファイル: SonarrSync.cs プロジェクト: anojht/Ombi
        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");
            }
        }