private void Import(TrackedDownload trackedDownload) { var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedTracksImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteAlbum.Artist, trackedDownload.DownloadItem); if (importResults.Empty()) { trackedDownload.State = TrackedDownloadStage.ImportFailed; trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); return; } if (importResults.All(c => c.Result == ImportResultType.Imported) || importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteAlbum.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount)))) { trackedDownload.State = TrackedDownloadStage.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); return; } if (importResults.Any(c => c.Result != ImportResultType.Imported)) { trackedDownload.State = TrackedDownloadStage.ImportFailed; var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.Item.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); } }
private void Import(TrackedDownload trackedDownload) { var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); return; } if (importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteEpisode.Episodes.Count)) { trackedDownload.State = TrackedDownloadStage.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); return; } if (importResults.Any(c => c.Result != ImportResultType.Imported)) { var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); } }
public void Import(TrackedDownload trackedDownload) { trackedDownload.State = TrackedDownloadState.Importing; var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); if (VerifyImport(trackedDownload, importResults)) { return; } trackedDownload.State = TrackedDownloadState.ImportPending; if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); } if (importResults.Any(c => c.Result != ImportResultType.Imported)) { var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported && v.ImportDecision.LocalEpisode != null) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); } }
public void Import(TrackedDownload trackedDownload) { trackedDownload.State = TrackedDownloadState.Importing; var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedTracksImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteBook.Author, trackedDownload.DownloadItem); if (importResults.Empty()) { trackedDownload.State = TrackedDownloadState.ImportFailed; trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); _eventAggregator.PublishEvent(new BookImportIncompleteEvent(trackedDownload)); return; } if (VerifyImport(trackedDownload, importResults)) { return; } trackedDownload.State = TrackedDownloadState.ImportPending; if (importResults.Any(c => c.Result != ImportResultType.Imported)) { trackedDownload.State = TrackedDownloadState.ImportFailed; var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.Item.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); _eventAggregator.PublishEvent(new BookImportIncompleteEvent(trackedDownload)); return; } }
public void Process(TrackedDownload trackedDownload, bool ignoreWarnings = false) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed) { return; } if (!ignoreWarnings) { var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Sonarr and not in a category, Skipping."); return; } var downloadItemOutputPath = trackedDownload.DownloadItem.OutputPath; if (downloadItemOutputPath.IsEmpty) { trackedDownload.Warn("Download doesn't contain intermediate path, Skipping."); return; } if ((OsInfo.IsWindows && !downloadItemOutputPath.IsWindowsPath) || (OsInfo.IsNotWindows && !downloadItemOutputPath.IsUnixPath)) { trackedDownload.Warn("[{0}] is not a valid local path. You may need a Remote Path Mapping.", downloadItemOutputPath); return; } var downloadedEpisodesFolder = new OsPath(_configService.DownloadedEpisodesFolder); if (downloadedEpisodesFolder.Contains(downloadItemOutputPath)) { trackedDownload.Warn("Intermediate Download path inside drone factory, Skipping."); return; } var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); if (series == null) { if (historyItem != null) { series = _seriesService.GetSeries(historyItem.SeriesId); } if (series == null) { trackedDownload.Warn("Series title mismatch, automatic import is not possible."); return; } } } Import(trackedDownload); }
public void Import(TrackedDownload trackedDownload) { SetImportItem(trackedDownload); if (!ValidatePath(trackedDownload)) { return; } if (trackedDownload.RemoteEpisode == null) { trackedDownload.Warn("Unable to parse download, automatic import is not possible."); return; } trackedDownload.State = TrackedDownloadState.Importing; var outputPath = trackedDownload.ImportItem.OutputPath.FullPath; var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.ImportItem); if (VerifyImport(trackedDownload, importResults)) { return; } trackedDownload.State = TrackedDownloadState.ImportPending; if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); return; } var statusMessages = new List <TrackedDownloadStatusMessage> { new TrackedDownloadStatusMessage("One or more episodes expected in this release were not imported or missing", new List <string>()) }; if (importResults.Any(c => c.Result != ImportResultType.Imported)) { statusMessages.AddRange( importResults .Where(v => v.Result != ImportResultType.Imported && v.ImportDecision.LocalEpisode != null) .OrderBy(v => v.ImportDecision.LocalEpisode.Path) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) ); } if (statusMessages.Any()) { trackedDownload.Warn(statusMessages.ToArray()); } }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed || trackedDownload.RemoteBook == null) { return; } trackedDownload.ImportItem = _importItemService.ProvideImportItem(trackedDownload.DownloadItem, trackedDownload.ImportItem); // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Readarr and not in a category, Skipping."); return; } var downloadItemOutputPath = trackedDownload.ImportItem.OutputPath; if (downloadItemOutputPath.IsEmpty) { trackedDownload.Warn("Download doesn't contain intermediate path, Skipping."); return; } if ((OsInfo.IsWindows && !downloadItemOutputPath.IsWindowsPath) || (OsInfo.IsNotWindows && !downloadItemOutputPath.IsUnixPath)) { trackedDownload.Warn("[{0}] is not a valid local path. You may need a Remote Path Mapping.", downloadItemOutputPath); return; } var author = trackedDownload.RemoteBook.Author; if (author == null) { if (historyItem != null) { author = _authorService.GetAuthor(historyItem.AuthorId); } if (author == null) { trackedDownload.Warn("Author name mismatch, automatic import is not possible."); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; }
public void Import(TrackedDownload trackedDownload) { trackedDownload.State = TrackedDownloadState.Importing; var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); var allEpisodesImported = importResults.Where(c => c.Result == ImportResultType.Imported) .SelectMany(c => c.ImportDecision.LocalEpisode.Episodes) .Count() >= Math.Max(1, trackedDownload.RemoteEpisode.Episodes.Count); if (allEpisodesImported) { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); return; } // Double check if all episodes were imported by checking the history if at least one // file was imported. This will allow the decision engine to reject already imported // episode files and still mark the download complete when all files are imported. if (importResults.Any(c => c.Result == ImportResultType.Imported)) { var historyItems = _historyService.FindByDownloadId(trackedDownload.DownloadItem.DownloadId) .OrderByDescending(h => h.Date) .ToList(); var allEpisodesImportedInHistory = _trackedDownloadAlreadyImported.IsImported(trackedDownload, historyItems); if (allEpisodesImportedInHistory) { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); } if (importResults.Any(c => c.Result != ImportResultType.Imported)) { var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); } }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed) { return; } SetImportItem(trackedDownload); // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Sonarr and not in a category, Skipping."); return; } if (!ValidatePath(trackedDownload)) { return; } var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); if (series == null) { if (historyItem != null) { series = _seriesService.GetSeries(historyItem.SeriesId); } if (series == null) { trackedDownload.Warn("Series title mismatch; automatic import is not possible."); return; } Enum.TryParse(historyItem.Data.GetValueOrDefault(EpisodeHistory.SERIES_MATCH_TYPE, SeriesMatchType.Unknown.ToString()), out SeriesMatchType seriesMatchType); if (seriesMatchType == SeriesMatchType.Id) { trackedDownload.Warn("Found matching series via grab history, but release was matched to series by ID. Automatic import is not possible."); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed) { return; } // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Sonarr and not in a category, Skipping."); return; } var downloadItemOutputPath = trackedDownload.DownloadItem.OutputPath; if (downloadItemOutputPath.IsEmpty) { trackedDownload.Warn("Download doesn't contain intermediate path, Skipping."); return; } if ((OsInfo.IsWindows && !downloadItemOutputPath.IsWindowsPath) || (OsInfo.IsNotWindows && !downloadItemOutputPath.IsUnixPath)) { trackedDownload.Warn("[{0}] is not a valid local path. You may need a Remote Path Mapping.", downloadItemOutputPath); return; } var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); if (series == null) { if (historyItem != null) { series = _seriesService.GetSeries(historyItem.SeriesId); } if (series == null) { trackedDownload.Warn("Series title mismatch, automatic import is not possible."); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; }
public void Process(TrackedDownload trackedDownload, bool ignoreWarnings = false) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed || trackedDownload.RemoteAlbum == null) { return; } if (!ignoreWarnings) { var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Lidarr and not in a category, Skipping."); return; } var downloadItemOutputPath = trackedDownload.DownloadItem.OutputPath; if (downloadItemOutputPath.IsEmpty) { trackedDownload.Warn("Download doesn't contain intermediate path, Skipping."); return; } if ((OsInfo.IsWindows && !downloadItemOutputPath.IsWindowsPath) || (OsInfo.IsNotWindows && !downloadItemOutputPath.IsUnixPath)) { trackedDownload.Warn("[{0}] is not a valid local path. You may need a Remote Path Mapping.", downloadItemOutputPath); return; } var artist = trackedDownload.RemoteAlbum.Artist; if (artist == null) { if (historyItem != null) { artist = _artistService.GetArtist(historyItem.ArtistId); } if (artist == null) { trackedDownload.Warn("Artist name mismatch, automatic import is not possible."); return; } } } Import(trackedDownload); }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed) { return; } SetImportItem(trackedDownload); // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Readarr and not in a category, Skipping."); return; } if (!ValidatePath(trackedDownload)) { return; } trackedDownload.State = TrackedDownloadState.ImportPending; }
public void Process(TrackedDownload trackedDownload) { string failure = null; if (trackedDownload.DownloadItem.IsEncrypted) { failure = "Encrypted download detected"; } else if (trackedDownload.DownloadItem.Status == DownloadItemStatus.Failed) { failure = trackedDownload.DownloadItem.Message ?? "Failed download detected"; } if (failure != null) { var grabbedItems = _historyService.Find(trackedDownload.DownloadItem.DownloadId, HistoryEventType.Grabbed) .ToList(); if (grabbedItems.Empty()) { trackedDownload.Warn("Download wasn't grabbed by Bonarr, skipping"); return; } trackedDownload.State = TrackedDownloadStage.DownloadFailed; PublishDownloadFailedEvent(grabbedItems, failure, trackedDownload); } }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed || trackedDownload.RemoteAlbum == null) { return; } SetImportItem(trackedDownload); // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Lidarr and not in a category, Skipping."); return; } if (!ValidatePath(trackedDownload)) { return; } var artist = trackedDownload.RemoteAlbum.Artist; if (artist == null) { if (historyItem != null) { artist = _artistService.GetArtist(historyItem.ArtistId); } if (artist == null) { trackedDownload.Warn("Artist name mismatch, automatic import is not possible."); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; }
public void Check(TrackedDownload trackedDownload) { if (trackedDownload.DownloadItem.Status != DownloadItemStatus.Completed) { return; } SetImportItem(trackedDownload); // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } var historyItem = _historyService.MostRecentForDownloadId(trackedDownload.DownloadItem.DownloadId); if (historyItem == null && trackedDownload.DownloadItem.Category.IsNullOrWhiteSpace()) { trackedDownload.Warn("Download wasn't grabbed by Sonarr and not in a category, Skipping."); return; } if (!ValidatePath(trackedDownload)) { return; } var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); if (series == null) { if (historyItem != null) { series = _seriesService.GetSeries(historyItem.SeriesId); } if (series == null) { trackedDownload.Warn("Series title mismatch, automatic import is not possible."); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; }
private bool ValidatePath(TrackedDownload trackedDownload) { var downloadItemOutputPath = trackedDownload.ImportItem.OutputPath; if (downloadItemOutputPath.IsEmpty) { trackedDownload.Warn("Download doesn't contain intermediate path, Skipping."); return(false); } if ((OsInfo.IsWindows && !downloadItemOutputPath.IsWindowsPath) || (OsInfo.IsNotWindows && !downloadItemOutputPath.IsUnixPath)) { trackedDownload.Warn("[{0}] is not a valid local path. You may need a Remote Path Mapping.", downloadItemOutputPath); return(false); } return(true); }
public void Check(TrackedDownload trackedDownload) { // Only process tracked downloads that are still downloading if (trackedDownload.State != TrackedDownloadState.Downloading) { return; } if (trackedDownload.DownloadItem.IsEncrypted || trackedDownload.DownloadItem.Status == DownloadItemStatus.Failed) { var grabbedItems = _historyService .Find(trackedDownload.DownloadItem.DownloadId, HistoryEventType.Grabbed) .ToList(); if (grabbedItems.Empty()) { trackedDownload.Warn("Download wasn't grabbed by sonarr, skipping"); return; } trackedDownload.State = TrackedDownloadState.FailedPending; } }
public void Import(TrackedDownload trackedDownload) { SetImportItem(trackedDownload); if (!ValidatePath(trackedDownload)) { return; } trackedDownload.State = TrackedDownloadState.Importing; var outputPath = trackedDownload.ImportItem.OutputPath.FullPath; var importResults = _downloadedTracksImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteAlbum.Artist, trackedDownload.DownloadItem); if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); return; } var allTracksImported = importResults.All(c => c.Result == ImportResultType.Imported) || importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteAlbum.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount))); Console.WriteLine($"allimported: {allTracksImported}"); Console.WriteLine($"count: {importResults.Count(c => c.Result == ImportResultType.Imported)}"); Console.WriteLine($"max: {Math.Max(1, trackedDownload.RemoteAlbum.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount)))}"); if (allTracksImported) { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload, trackedDownload.RemoteAlbum.Artist.Id)); return; } // Double check if all albums were imported by checking the history if at least one // file was imported. This will allow the decision engine to reject already imported // albums and still mark the download complete when all files are imported. if (importResults.Any(c => c.Result == ImportResultType.Imported)) { var historyItems = _historyService.FindByDownloadId(trackedDownload.DownloadItem.DownloadId) .OrderByDescending(h => h.Date) .ToList(); var allTracksImportedInHistory = _trackedDownloadAlreadyImported.IsImported(trackedDownload, historyItems); if (allTracksImportedInHistory) { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload, trackedDownload.RemoteAlbum.Artist.Id)); return; } } trackedDownload.State = TrackedDownloadState.ImportPending; if (importResults.Empty()) { trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); } if (importResults.Any(c => c.Result != ImportResultType.Imported)) { trackedDownload.State = TrackedDownloadState.ImportFailed; var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.Item.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); return; } }