private TrackedDownload GetTrackedDownload(String trackingId, Int32 downloadClient, DownloadClientItem downloadItem, List <History.History> grabbedHistory) { var trackedDownload = new TrackedDownload { TrackingId = trackingId, DownloadClient = downloadClient, DownloadItem = downloadItem, StartedTracking = DateTime.UtcNow, State = TrackedDownloadState.Unknown, Status = TrackedDownloadStatus.Ok, }; try { var historyItems = grabbedHistory.Where(h => { var downloadClientId = h.Data.GetValueOrDefault(DOWNLOAD_CLIENT_ID); if (downloadClientId == null) { return(false); } return(downloadClientId.Equals(trackedDownload.DownloadItem.DownloadClientId)); }).ToList(); var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title); if (parsedEpisodeInfo == null) { return(null); } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { if (historyItems.Empty()) { return(null); } trackedDownload.Status = TrackedDownloadStatus.Warning; trackedDownload.StatusMessages.Add(new TrackedDownloadStatusMessage( trackedDownload.DownloadItem.Title, "Series title mismatch, automatic import is not possible") ); remoteEpisode = _parsingService.Map(parsedEpisodeInfo, historyItems.First().SeriesId, historyItems.Select(h => h.EpisodeId)); } trackedDownload.RemoteEpisode = remoteEpisode; } catch (Exception e) { _logger.DebugException("Failed to find episode for " + downloadItem.Title, e); return(null); } return(trackedDownload); }
public TrackedDownload TrackDownload(DownloadClientDefinition downloadClient, DownloadClientItem downloadItem) { var existingItem = Find(downloadItem.DownloadId); if (existingItem != null && existingItem.State != TrackedDownloadStage.Downloading) { existingItem.DownloadItem = downloadItem; return(existingItem); } var trackedDownload = new TrackedDownload { DownloadClient = downloadClient.Id, DownloadItem = downloadItem, Protocol = downloadClient.Protocol }; try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title); var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId); if (parsedEpisodeInfo != null) { trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0); } if (historyItems.Any()) { var firstHistoryItem = historyItems.OrderByDescending(h => h.Date).First(); trackedDownload.State = GetStateFromHistory(firstHistoryItem.EventType); if (parsedEpisodeInfo == null || trackedDownload.RemoteEpisode == null || trackedDownload.RemoteEpisode.Series == null || trackedDownload.RemoteEpisode.Episodes.Empty()) { parsedEpisodeInfo = Parser.Parser.ParseTitle(firstHistoryItem.SourceTitle); if (parsedEpisodeInfo != null) { trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, firstHistoryItem.SeriesId, historyItems.Where(v => v.EventType == HistoryEventType.Grabbed).Select(h => h.EpisodeId).Distinct()); } } } if (trackedDownload.RemoteEpisode == null) { return(null); } } catch (Exception e) { _logger.DebugException("Failed to find episode for " + downloadItem.Title, e); return(null); } _cache.Set(trackedDownload.DownloadItem.DownloadId, trackedDownload); return(trackedDownload); }
public TrackedDownload TrackDownload(DownloadClientDefinition downloadClient, DownloadClientItem downloadItem) { var existingItem = Find(downloadItem.DownloadId); if (existingItem != null && existingItem.State != TrackedDownloadStage.Downloading) { existingItem.DownloadItem = downloadItem; return(existingItem); } var trackedDownload = new TrackedDownload { DownloadClient = downloadClient.Id, DownloadItem = downloadItem, Protocol = downloadClient.Protocol }; try { var parsedMovieInfo = Parser.Parser.ParseMovieTitle(trackedDownload.DownloadItem.Title, _config.ParsingLeniency > 0); var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId); if (parsedMovieInfo != null) { trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null).RemoteMovie; } if (historyItems.Any()) { var firstHistoryItem = historyItems.OrderByDescending(h => h.Date).First(); trackedDownload.State = GetStateFromHistory(firstHistoryItem.EventType); if (parsedMovieInfo == null || trackedDownload.RemoteMovie == null || trackedDownload.RemoteMovie.Movie == null) { parsedMovieInfo = Parser.Parser.ParseMovieTitle(firstHistoryItem.SourceTitle, _config.ParsingLeniency > 0); if (parsedMovieInfo != null) { trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null).RemoteMovie; } } } if (trackedDownload.RemoteMovie == null) { return(null); } } catch (Exception e) { _logger.Debug(e, "Failed to find episode for " + downloadItem.Title); return(null); } _cache.Set(trackedDownload.DownloadItem.DownloadId, trackedDownload); return(trackedDownload); }
public TrackedDownload TrackDownload(DownloadClientDefinition downloadClient, DownloadClientItem downloadItem) { var existingItem = Find(downloadItem.DownloadId); if (existingItem != null && existingItem.State != TrackedDownloadStage.Downloading) { existingItem.DownloadItem = downloadItem; return(existingItem); } var trackedDownload = new TrackedDownload { DownloadClient = downloadClient.Id, DownloadItem = downloadItem, Protocol = downloadClient.Protocol }; try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title); if (parsedEpisodeInfo == null) { return(null); } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo); if (remoteEpisode.Series == null) { var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId); if (historyItems.Empty()) { return(null); } remoteEpisode = _parsingService.Map(parsedEpisodeInfo, historyItems.First().SeriesId, historyItems.Select(h => h.EpisodeId)); } trackedDownload.RemoteEpisode = remoteEpisode; } catch (Exception e) { _logger.DebugException("Failed to find episode for " + downloadItem.Title, e); return(null); } var historyItem = _historyService.MostRecentForDownloadId(downloadItem.DownloadId); if (historyItem != null) { trackedDownload.State = GetStateFromHistory(historyItem.EventType); } _cache.Set(trackedDownload.DownloadItem.DownloadId, trackedDownload); return(trackedDownload); }
private ParseResource Parse() { var title = Request.Query.Title.Value as string; var parsedBookInfo = Parser.ParseBookTitle(title); if (parsedBookInfo == null) { return(null); } var remoteBook = _parsingService.Map(parsedBookInfo); if (remoteBook != null) { return(new ParseResource { Title = title, ParsedBookInfo = remoteBook.ParsedBookInfo, Author = remoteBook.Author.ToResource(), Books = remoteBook.Books.ToResource() }); } else { return(new ParseResource { Title = title, ParsedBookInfo = parsedBookInfo }); } }
public ParseResource Parse(string title) { var parsedBookInfo = Parser.ParseBookTitle(title); if (parsedBookInfo == null) { return(null); } var remoteBook = _parsingService.Map(parsedBookInfo); if (remoteBook != null) { return(new ParseResource { Title = title, ParsedBookInfo = remoteBook.ParsedBookInfo, Author = remoteBook.Author.ToResource(), Books = remoteBook.Books.ToResource() }); } else { return(new ParseResource { Title = title, ParsedBookInfo = parsedBookInfo }); } }
private ParseResource Parse() { var title = Request.Query.Title.Value as string; var parsedMovieInfo = Parser.ParseMovieTitle(title, false); if (parsedMovieInfo == null) { return(null); } var remoteMovie = _parsingService.Map(parsedMovieInfo, ""); if (remoteMovie != null) { return(new ParseResource { Title = title, ParsedMovieInfo = remoteMovie.RemoteMovie.ParsedMovieInfo, Movie = remoteMovie.Movie.ToResource() }); } else { return(new ParseResource { Title = title, ParsedMovieInfo = parsedMovieInfo }); } }
private ParseResource Parse() { var title = Request.Query.Title.Value; var parsedEpisodeInfo = Parser.ParseTitle(title); if (parsedEpisodeInfo == null) { return(null); } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo); if (remoteEpisode == null) { remoteEpisode = new RemoteEpisode { ParsedEpisodeInfo = parsedEpisodeInfo }; return(new ParseResource { Title = title, ParsedEpisodeInfo = parsedEpisodeInfo }); } var resource = ToResource(remoteEpisode); resource.Title = title; return(resource); }
private ParseResource Parse() { var title = Request.Query.Title.Value as string; var path = Request.Query.Path.Value as string; var parsedEpisodeInfo = path.IsNotNullOrWhiteSpace() ? Parser.ParsePath(path) : Parser.ParseTitle(title); if (parsedEpisodeInfo == null) { return(null); } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0); if (remoteEpisode != null) { return(new ParseResource { Title = title, ParsedEpisodeInfo = remoteEpisode.ParsedEpisodeInfo, Series = remoteEpisode.Series.ToResource(), Episodes = remoteEpisode.Episodes.ToResource() }); } else { return(new ParseResource { Title = title, ParsedEpisodeInfo = parsedEpisodeInfo }); } }
public bool HasReleases(Movie movie) { try { var results = GetResults("movies", movie.Title); foreach (PreDBResult result in results) { var parsed = Parser.Parser.ParseMovieTitle(result.Title, true); if (parsed == null) { parsed = new Parser.Model.ParsedMovieInfo { MovieTitle = result.Title, Year = 0 }; } var match = _parsingService.Map(parsed, "", new MovieSearchCriteria { Movie = movie }); if (match != null && match.RemoteMovie.Movie != null && match.RemoteMovie.Movie.Id == movie.Id) { return(true); } } return(false); } catch (Exception ex) { _logger.Warn(ex, "Error while looking on predb.me."); return(false); } }
private ParseResource Parse() { var title = Request.Query.Title.Value as string; var parsedAlbumInfo = Parser.ParseAlbumTitle(title); if (parsedAlbumInfo == null) { return(null); } var remoteAlbum = _parsingService.Map(parsedAlbumInfo); if (remoteAlbum != null) { return(new ParseResource { Title = title, ParsedAlbumInfo = remoteAlbum.ParsedAlbumInfo, Artist = remoteAlbum.Artist.ToResource(), Albums = remoteAlbum.Albums.ToResource() }); } else { return(new ParseResource { Title = title, ParsedAlbumInfo = parsedAlbumInfo }); } }
public void UpdateAlbumCache(int albumId) { var updateCacheItems = _cache.Values.Where(x => x.RemoteAlbum != null && x.RemoteAlbum.Albums.Any(a => a.Id == albumId)).ToList(); foreach (var item in updateCacheItems) { var parsedAlbumInfo = Parser.Parser.ParseAlbumTitle(item.DownloadItem.Title); item.RemoteAlbum = null; if (parsedAlbumInfo != null) { item.RemoteAlbum = _parsingService.Map(parsedAlbumInfo); } } _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); }
private Response DownloadRelease(ReleaseResource release) { var remoteEpisode = _parsingService.Map(release.InjectTo <ParsedEpisodeInfo>(), 0); remoteEpisode.Release = release.InjectTo <ReleaseInfo>(); _downloadService.DownloadReport(remoteEpisode); return(release.AsResponse()); }
public void UpdateBookCache(int bookId) { var updateCacheItems = _cache.Values.Where(x => x.RemoteBook != null && x.RemoteBook.Books.Any(a => a.Id == bookId)).ToList(); if (updateCacheItems.Any()) { foreach (var item in updateCacheItems) { var parsedBookInfo = Parser.Parser.ParseBookTitle(item.DownloadItem.Title); item.RemoteBook = null; if (parsedBookInfo != null) { item.RemoteBook = _parsingService.Map(parsedBookInfo); } } _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); } }
private IEnumerable <DownloadDecision> GetDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} reports", reports.Count); } else { _logger.ProgressInfo("No reports found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing report {0}/{1}", reportNumber, reports.Count); try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(report.Title); if (parsedEpisodeInfo != null && !string.IsNullOrWhiteSpace(parsedEpisodeInfo.SeriesTitle)) { var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, report.TvRageId, searchCriteria); remoteEpisode.Release = report; if (remoteEpisode.Series != null) { remoteEpisode.DownloadAllowed = true; decision = GetDecisionForReport(remoteEpisode, searchCriteria); } else { decision = new DownloadDecision(remoteEpisode, "Unknown Series"); } } } catch (Exception e) { _logger.ErrorException("Couldn't process report.", e); } reportNumber++; if (decision != null) { yield return(decision); } } }
public override IEnumerable <QueueItem> GetQueue() { return(_queueCache.Get("queue", () => { SabnzbdQueue sabQueue; try { sabQueue = _proxy.GetQueue(0, 0, Settings); } catch (DownloadClientException ex) { _logger.ErrorException(ex.Message, ex); return Enumerable.Empty <QueueItem>(); } var queueItems = new List <QueueItem>(); foreach (var sabQueueItem in sabQueue.Items) { var queueItem = new QueueItem(); queueItem.Id = sabQueueItem.Id; queueItem.Title = sabQueueItem.Title; queueItem.Size = sabQueueItem.Size; queueItem.Sizeleft = sabQueueItem.Sizeleft; queueItem.Timeleft = sabQueueItem.Timeleft; queueItem.Status = sabQueueItem.Status; var parsedEpisodeInfo = Parser.Parser.ParseTitle(queueItem.Title.Replace("ENCRYPTED / ", "")); if (parsedEpisodeInfo == null) { continue; } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { continue; } queueItem.RemoteEpisode = remoteEpisode; queueItems.Add(queueItem); } return queueItems; }, TimeSpan.FromSeconds(10))); }
public override IEnumerable <QueueItem> GetQueue() { List <NzbgetQueueItem> queue; try { queue = _proxy.GetQueue(Settings); } catch (DownloadClientException ex) { _logger.ErrorException(ex.Message, ex); return(Enumerable.Empty <QueueItem>()); } var queueItems = new List <QueueItem>(); foreach (var item in queue) { var droneParameter = item.Parameters.SingleOrDefault(p => p.Name == "drone"); var queueItem = new QueueItem(); queueItem.Id = droneParameter == null?item.NzbId.ToString() : droneParameter.Value.ToString(); queueItem.Title = item.NzbName; queueItem.Size = item.FileSizeMb; queueItem.Sizeleft = item.RemainingSizeMb; queueItem.Status = item.FileSizeMb == item.PausedSizeMb ? "paused" : "queued"; var parsedEpisodeInfo = Parser.Parser.ParseTitle(queueItem.Title); if (parsedEpisodeInfo == null) { continue; } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { continue; } queueItem.RemoteEpisode = remoteEpisode; queueItems.Add(queueItem); } return(queueItems); }
protected RemoteEpisode GetRemoteEpisode(String title) { var parsedEpisodeInfo = Parser.Parser.ParseTitle(title); if (parsedEpisodeInfo == null) { return(null); } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { return(null); } return(remoteEpisode); }
public IEnumerable <QueueItem> GetQueue() { return(_queueCache.Get("queue", () => { string action = String.Format("mode=queue&output=json&start={0}&limit={1}", 0, 0); string request = GetSabRequest(action); string response = _httpProvider.DownloadString(request); CheckForError(response); var sabQueue = Json.Deserialize <SabQueue>(JObject.Parse(response).SelectToken("queue").ToString()).Items; var queueItems = new List <QueueItem>(); foreach (var sabQueueItem in sabQueue) { var queueItem = new QueueItem(); queueItem.Id = sabQueueItem.Id; queueItem.Title = sabQueueItem.Title; queueItem.Size = sabQueueItem.Size; queueItem.Sizeleft = sabQueueItem.Sizeleft; queueItem.Timeleft = sabQueueItem.Timeleft; queueItem.Status = sabQueueItem.Status; var parsedEpisodeInfo = Parser.Parser.ParseTitle(queueItem.Title); if (parsedEpisodeInfo == null) { continue; } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { continue; } queueItem.RemoteEpisode = remoteEpisode; queueItems.Add(queueItem); } return queueItems; }, TimeSpan.FromSeconds(10))); }
public virtual IEnumerable <QueueItem> GetQueue() { var command = new JsonRequest { Method = "listgroups", Params = null }; var response = PostCommand(command.ToJson()); CheckForError(response); var itmes = Json.Deserialize <NzbGetQueue>(response).QueueItems; foreach (var nzbGetQueueItem in itmes) { var queueItem = new QueueItem(); queueItem.Id = nzbGetQueueItem.NzbId.ToString(); queueItem.Title = nzbGetQueueItem.NzbName; queueItem.Size = nzbGetQueueItem.FileSizeMb; queueItem.Sizeleft = nzbGetQueueItem.RemainingSizeMb; var parsedEpisodeInfo = Parser.Parser.ParseTitle(queueItem.Title); if (parsedEpisodeInfo == null) { continue; } var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0); if (remoteEpisode.Series == null) { continue; } queueItem.RemoteEpisode = remoteEpisode; yield return(queueItem); } }
public ParseResource Parse(string title) { if (title.IsNullOrWhiteSpace()) { return(null); } var parsedMovieInfo = _parsingService.ParseMovieInfo(title, new List <object>()); if (parsedMovieInfo == null) { return(new ParseResource { Title = title }); } var remoteMovie = _parsingService.Map(parsedMovieInfo, ""); if (remoteMovie != null) { return(new ParseResource { Title = title, ParsedMovieInfo = remoteMovie.RemoteMovie.ParsedMovieInfo, Movie = remoteMovie.Movie.ToResource(_configService.AvailabilityDelay) }); } else { return(new ParseResource { Title = title, ParsedMovieInfo = parsedMovieInfo }); } }
private ParseResource Parse() { var title = Request.Query.Title.Value as string; if (title.IsNullOrWhiteSpace()) { return(null); } var parsedMovieInfo = _parsingService.ParseMovieInfo(title, new List <object>()); if (parsedMovieInfo == null) { return(null); } var remoteMovie = _parsingService.Map(parsedMovieInfo, ""); if (remoteMovie != null) { return(new ParseResource { Title = title, ParsedMovieInfo = remoteMovie.RemoteMovie.ParsedMovieInfo, Movie = remoteMovie.Movie.ToResource(_configService.AvailabilityDelay) }); } else { return(new ParseResource { Title = title, ParsedMovieInfo = parsedMovieInfo }); } }
private List <PendingRelease> IncludeRemoteEpisodes(List <PendingRelease> releases, Dictionary <string, RemoteEpisode> knownRemoteEpisodes = null) { var result = new List <PendingRelease>(); var seriesMap = new Dictionary <int, Series>(); if (knownRemoteEpisodes != null) { foreach (var series in knownRemoteEpisodes.Values.Select(v => v.Series)) { if (!seriesMap.ContainsKey(series.Id)) { seriesMap[series.Id] = series; } } } foreach (var series in _seriesService.GetSeries(releases.Select(v => v.SeriesId).Distinct().Where(v => !seriesMap.ContainsKey(v)))) { seriesMap[series.Id] = series; } foreach (var release in releases) { var series = seriesMap.GetValueOrDefault(release.SeriesId); // Just in case the series was removed, but wasn't cleaned up yet (housekeeper will clean it up) if (series == null) { return(null); } release.RemoteEpisode = new RemoteEpisode { Series = series, ParsedEpisodeInfo = release.ParsedEpisodeInfo, Release = release.Release }; RemoteEpisode knownRemoteEpisode; if (knownRemoteEpisodes != null && knownRemoteEpisodes.TryGetValue(release.Release.Title, out knownRemoteEpisode)) { release.RemoteEpisode.MappedSeasonNumber = knownRemoteEpisode.MappedSeasonNumber; release.RemoteEpisode.Episodes = knownRemoteEpisode.Episodes; } else if (ValidateParsedEpisodeInfo.ValidateForSeriesType(release.ParsedEpisodeInfo, series)) { var remoteEpisode = _parsingService.Map(release.ParsedEpisodeInfo, series); release.RemoteEpisode.MappedSeasonNumber = remoteEpisode.MappedSeasonNumber; release.RemoteEpisode.Episodes = remoteEpisode.Episodes; } else { release.RemoteEpisode.MappedSeasonNumber = release.ParsedEpisodeInfo.SeasonNumber; release.RemoteEpisode.Episodes = new List <Episode>(); } result.Add(release); } return(result); }
private IEnumerable <DownloadDecision> GetDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} releases", reports.Count); } else { _logger.ProgressInfo("No results found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing release {0}/{1}", reportNumber, reports.Count); _logger.Debug("Processing release '{0}' from '{1}'", report.Title, report.Indexer); try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(report.Title); if (parsedEpisodeInfo == null || parsedEpisodeInfo.IsPossibleSpecialEpisode) { var specialEpisodeInfo = _parsingService.ParseSpecialEpisodeTitle(parsedEpisodeInfo, report.Title, report.TvdbId, report.TvRageId, searchCriteria); if (specialEpisodeInfo != null) { parsedEpisodeInfo = specialEpisodeInfo; } } if (parsedEpisodeInfo != null && !parsedEpisodeInfo.SeriesTitle.IsNullOrWhiteSpace()) { var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, report.TvdbId, report.TvRageId, searchCriteria); remoteEpisode.Release = report; if (remoteEpisode.Series == null) { var reason = "Unknown Series"; var matchingTvdbId = _sceneMappingService.FindTvdbId(parsedEpisodeInfo.SeriesTitle, parsedEpisodeInfo.ReleaseTitle, parsedEpisodeInfo.SeasonNumber); if (matchingTvdbId.HasValue) { reason = $"{parsedEpisodeInfo.SeriesTitle} matches an alias for series with TVDB ID: {matchingTvdbId}"; } decision = new DownloadDecision(remoteEpisode, new Rejection(reason)); } else if (remoteEpisode.Episodes.Empty()) { decision = new DownloadDecision(remoteEpisode, new Rejection("Unable to identify correct episode(s) using release name and scene mappings")); } else { _aggregationService.Augment(remoteEpisode); remoteEpisode.DownloadAllowed = remoteEpisode.Episodes.Any(); decision = GetDecisionForReport(remoteEpisode, searchCriteria); } } if (searchCriteria != null) { if (parsedEpisodeInfo == null) { parsedEpisodeInfo = new ParsedEpisodeInfo { Language = LanguageParser.ParseLanguage(report.Title), Quality = QualityParser.ParseQuality(report.Title) }; } if (parsedEpisodeInfo.SeriesTitle.IsNullOrWhiteSpace()) { var remoteEpisode = new RemoteEpisode { Release = report, ParsedEpisodeInfo = parsedEpisodeInfo }; decision = new DownloadDecision(remoteEpisode, new Rejection("Unable to parse release")); } } } catch (Exception e) { _logger.Error(e, "Couldn't process release."); var remoteEpisode = new RemoteEpisode { Release = report }; decision = new DownloadDecision(remoteEpisode, new Rejection("Unexpected error processing release")); } reportNumber++; if (decision != null) { if (decision.Rejections.Any()) { _logger.Debug("Release rejected for the following reasons: {0}", string.Join(", ", decision.Rejections)); } else { _logger.Debug("Release accepted"); } yield return(decision); } } }
public TrackedDownload TrackDownload(DownloadClientDefinition downloadClient, DownloadClientItem downloadItem) { var existingItem = Find(downloadItem.DownloadId); if (existingItem != null && existingItem.State != TrackedDownloadStage.Downloading) { LogItemChange(existingItem, existingItem.DownloadItem, downloadItem); existingItem.DownloadItem = downloadItem; return(existingItem); } var trackedDownload = new TrackedDownload { DownloadClient = downloadClient.Id, DownloadItem = downloadItem, Protocol = downloadClient.Protocol }; try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title); var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId); if (parsedEpisodeInfo != null) { trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, 0, 0); } if (historyItems.Any()) { var firstHistoryItem = historyItems.OrderByDescending(h => h.Date).First(); trackedDownload.State = GetStateFromHistory(firstHistoryItem.EventType); if (parsedEpisodeInfo == null || trackedDownload.RemoteEpisode == null || trackedDownload.RemoteEpisode.Series == null || trackedDownload.RemoteEpisode.Episodes.Empty()) { // Try parsing the original source title and if that fails, try parsing it as a special // TODO: Pass the TVDB ID and TVRage IDs in as well so we have a better chance for finding the item parsedEpisodeInfo = Parser.Parser.ParseTitle(firstHistoryItem.SourceTitle) ?? _parsingService.ParseSpecialEpisodeTitle(parsedEpisodeInfo, firstHistoryItem.SourceTitle, 0, 0); if (parsedEpisodeInfo != null) { trackedDownload.RemoteEpisode = _parsingService.Map(parsedEpisodeInfo, firstHistoryItem.SeriesId, historyItems.Where(v => v.EventType == HistoryEventType.Grabbed).Select(h => h.EpisodeId).Distinct()); } } } if (trackedDownload.RemoteEpisode == null) { _logger.Trace("No Episode found for download '{0}', not tracking.", trackedDownload.DownloadItem.Title); return(null); } } catch (Exception e) { _logger.Debug(e, "Failed to find episode for " + downloadItem.Title); return(null); } LogItemChange(trackedDownload, existingItem?.DownloadItem, trackedDownload.DownloadItem); _cache.Set(trackedDownload.DownloadItem.DownloadId, trackedDownload); return(trackedDownload); }
private IEnumerable <DownloadDecision> GetAlbumDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} releases", reports.Count); } else { _logger.ProgressInfo("No results found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing release {0}/{1}", reportNumber, reports.Count); _logger.Debug("Processing release '{0}' from '{1}'", report.Title, report.Indexer); try { var parsedAlbumInfo = Parser.Parser.ParseAlbumTitle(report.Title); if (parsedAlbumInfo == null && searchCriteria != null) { parsedAlbumInfo = Parser.Parser.ParseAlbumTitleWithSearchCriteria(report.Title, searchCriteria.Artist, searchCriteria.Albums); } if (parsedAlbumInfo != null) { // TODO: Artist Data Augment without calling to parse title again //if (!report.Artist.IsNullOrWhiteSpace()) //{ // if (parsedAlbumInfo.ArtistName.IsNullOrWhiteSpace() || _parsingService.GetArtist(parsedAlbumInfo.ArtistName) == null) // { // parsedAlbumInfo.ArtistName = report.Artist; // } //} // TODO: Replace Parsed AlbumTitle with metadata Title if Parsed AlbumTitle not a valid match //if (!report.Album.IsNullOrWhiteSpace()) //{ // parsedAlbumInfo.AlbumTitle = report.Album; //} if (!parsedAlbumInfo.ArtistName.IsNullOrWhiteSpace()) { var remoteAlbum = _parsingService.Map(parsedAlbumInfo, searchCriteria); // try parsing again using the search criteria, in case it parsed but parsed incorrectly if ((remoteAlbum.Artist == null || remoteAlbum.Albums.Empty()) && searchCriteria != null) { _logger.Debug("Artist/Album null for {0}, reparsing with search criteria", report.Title); var parsedAlbumInfoWithCriteria = Parser.Parser.ParseAlbumTitleWithSearchCriteria(report.Title, searchCriteria.Artist, searchCriteria.Albums); if (parsedAlbumInfoWithCriteria != null && parsedAlbumInfoWithCriteria.ArtistName.IsNotNullOrWhiteSpace()) { remoteAlbum = _parsingService.Map(parsedAlbumInfoWithCriteria, searchCriteria); } } remoteAlbum.Release = report; if (remoteAlbum.Artist == null) { decision = new DownloadDecision(remoteAlbum, new Rejection("Unknown Artist")); // shove in the searched artist in case of forced download in interactive search if (searchCriteria != null) { remoteAlbum.Artist = searchCriteria.Artist; remoteAlbum.Albums = searchCriteria.Albums; } } else if (remoteAlbum.Albums.Empty()) { decision = new DownloadDecision(remoteAlbum, new Rejection("Unable to parse albums from release name")); if (searchCriteria != null) { remoteAlbum.Albums = searchCriteria.Albums; } } else { _aggregationService.Augment(remoteAlbum); remoteAlbum.DownloadAllowed = remoteAlbum.Albums.Any(); decision = GetDecisionForReport(remoteAlbum, searchCriteria); } } } } catch (Exception e) { _logger.Error(e, "Couldn't process release."); var remoteAlbum = new RemoteAlbum { Release = report }; decision = new DownloadDecision(remoteAlbum, new Rejection("Unexpected error processing release")); } reportNumber++; if (decision != null) { if (decision.Rejections.Any()) { _logger.Debug("Release rejected for the following reasons: {0}", string.Join(", ", decision.Rejections)); } else { _logger.Debug("Release accepted"); } yield return(decision); } } }
private IEnumerable <DownloadDecision> GetDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} releases", reports.Count); } else { _logger.ProgressInfo("No results found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing release {0}/{1}", reportNumber, reports.Count); try { var parsedEpisodeInfo = Parser.Parser.ParseTitle(report.Title); if (parsedEpisodeInfo == null || parsedEpisodeInfo.IsPossibleSpecialEpisode) { var specialEpisodeInfo = _parsingService.ParseSpecialEpisodeTitle(report.Title, report.TvRageId, searchCriteria); if (specialEpisodeInfo != null) { parsedEpisodeInfo = specialEpisodeInfo; } } if (parsedEpisodeInfo != null && !parsedEpisodeInfo.SeriesTitle.IsNullOrWhiteSpace()) { var remoteEpisode = _parsingService.Map(parsedEpisodeInfo, report.TvRageId, searchCriteria); remoteEpisode.Release = report; if (remoteEpisode.Series != null) { remoteEpisode.DownloadAllowed = remoteEpisode.Episodes.Any(); decision = GetDecisionForReport(remoteEpisode, searchCriteria); } else { decision = new DownloadDecision(remoteEpisode, new Rejection("Unknown Series")); } } } catch (Exception e) { _logger.ErrorException("Couldn't process release.", e); } reportNumber++; if (decision != null) { if (decision.Rejections.Any()) { _logger.Debug("Release rejected for the following reasons: {0}", String.Join(", ", decision.Rejections)); } yield return(decision); } } }
public TrackedDownload TrackDownload(DownloadClientDefinition downloadClient, DownloadClientItem downloadItem) { var existingItem = Find(downloadItem.DownloadId); if (existingItem != null && existingItem.State != TrackedDownloadState.Downloading) { LogItemChange(existingItem, existingItem.DownloadItem, downloadItem); existingItem.DownloadItem = downloadItem; existingItem.IsTrackable = true; return(existingItem); } var trackedDownload = new TrackedDownload { DownloadClient = downloadClient.Id, DownloadItem = downloadItem, Protocol = downloadClient.Protocol, IsTrackable = true }; try { var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId) .OrderByDescending(h => h.Date) .ToList(); var grabbedHistoryItem = historyItems.FirstOrDefault(h => h.EventType == MovieHistoryEventType.Grabbed); //TODO: Create release info from history and use that here, so we don't loose indexer flags! var parsedMovieInfo = _parsingService.ParseMovieInfo(trackedDownload.DownloadItem.Title, new List <object> { grabbedHistoryItem }); if (parsedMovieInfo != null) { trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null).RemoteMovie; } var downloadHistory = _downloadHistoryService.GetLatestDownloadHistoryItem(downloadItem.DownloadId); if (downloadHistory != null) { var state = GetStateFromHistory(downloadHistory.EventType); trackedDownload.State = state; } if (historyItems.Any()) { var firstHistoryItem = historyItems.FirstOrDefault(); var grabbedEvent = historyItems.FirstOrDefault(v => v.EventType == MovieHistoryEventType.Grabbed); trackedDownload.Indexer = grabbedEvent?.Data["indexer"]; if (parsedMovieInfo == null || trackedDownload.RemoteMovie == null || trackedDownload.RemoteMovie.Movie == null) { parsedMovieInfo = _parsingService.ParseMovieInfo(firstHistoryItem.SourceTitle, new List <object> { grabbedHistoryItem }); if (parsedMovieInfo != null) { trackedDownload.RemoteMovie = _parsingService.Map(parsedMovieInfo, "", null).RemoteMovie; } } } // Calculate custom formats if (trackedDownload.RemoteMovie != null) { trackedDownload.RemoteMovie.CustomFormats = _formatCalculator.ParseCustomFormat(parsedMovieInfo); } // Track it so it can be displayed in the queue even though we can't determine which movie it is for if (trackedDownload.RemoteMovie == null) { _logger.Trace("No Movie found for download '{0}'", trackedDownload.DownloadItem.Title); } } catch (Exception e) { _logger.Debug(e, "Failed to find movie for " + downloadItem.Title); return(null); } LogItemChange(trackedDownload, existingItem?.DownloadItem, trackedDownload.DownloadItem); _cache.Set(trackedDownload.DownloadItem.DownloadId, trackedDownload); return(trackedDownload); }
private IEnumerable <DownloadDecision> GetMovieDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} releases", reports.Count); } else { _logger.ProgressInfo("No results found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing release {0}/{1}", reportNumber, reports.Count); try { var parsedMovieInfo = _parsingService.ParseMovieInfo(report.Title, new List <object> { report }); MappingResult result = null; if (parsedMovieInfo == null || parsedMovieInfo.MovieTitle.IsNullOrWhiteSpace()) { _logger.Debug("{0} could not be parsed :(.", report.Title); parsedMovieInfo = new ParsedMovieInfo { MovieTitle = report.Title, Year = 1290, Languages = new List <Language> { Language.Unknown }, Quality = new QualityModel(), }; if (_configService.ParsingLeniency == ParsingLeniencyType.MappingLenient) { result = _parsingService.Map(parsedMovieInfo, report.ImdbId.ToString(), searchCriteria); } if (result == null || result.MappingResultType != MappingResultType.SuccessLenientMapping) { result = new MappingResult { MappingResultType = MappingResultType.NotParsable }; result.Movie = null; //To ensure we have a remote movie, else null exception on next line! result.RemoteMovie.ParsedMovieInfo = parsedMovieInfo; } else { //Enhance Parsed Movie Info! result.RemoteMovie.ParsedMovieInfo = Parser.Parser.ParseMinimalMovieTitle(parsedMovieInfo.MovieTitle, result.RemoteMovie.Movie.Title, parsedMovieInfo.Year); } } else { result = _parsingService.Map(parsedMovieInfo, report.ImdbId.ToString(), searchCriteria); } result.ReleaseName = report.Title; var remoteMovie = result.RemoteMovie; remoteMovie.Release = report; remoteMovie.MappingResult = result.MappingResultType; if (result.MappingResultType != MappingResultType.Success && result.MappingResultType != MappingResultType.SuccessLenientMapping) { var rejection = result.ToRejection(); decision = new DownloadDecision(remoteMovie, rejection); } else { if (parsedMovieInfo.Quality.HardcodedSubs.IsNotNullOrWhiteSpace()) { //remoteMovie.DownloadAllowed = true; if (_configService.AllowHardcodedSubs) { decision = GetDecisionForReport(remoteMovie, searchCriteria); } else { var whitelisted = _configService.WhitelistedHardcodedSubs.Split(','); _logger.Debug("Testing: {0}", whitelisted); if (whitelisted != null && whitelisted.Any(t => (parsedMovieInfo.Quality.HardcodedSubs.ToLower().Contains(t.ToLower()) && t.IsNotNullOrWhiteSpace()))) { decision = GetDecisionForReport(remoteMovie, searchCriteria); } else { decision = new DownloadDecision(remoteMovie, new Rejection("Hardcoded subs found: " + parsedMovieInfo.Quality.HardcodedSubs)); } } } else { //remoteMovie.DownloadAllowed = true; decision = GetDecisionForReport(remoteMovie, searchCriteria); } } } catch (Exception e) { _logger.Error(e, "Couldn't process release."); var remoteMovie = new RemoteMovie { Release = report }; decision = new DownloadDecision(remoteMovie, new Rejection("Unexpected error processing release")); } reportNumber++; if (decision != null) { if (decision.Rejections.Any()) { _logger.Debug("Release rejected for the following reasons: {0}", string.Join(", ", decision.Rejections)); } else { _logger.Debug("Release accepted"); } yield return(decision); } } }
private IEnumerable <DownloadDecision> GetBookDecisions(List <ReleaseInfo> reports, SearchCriteriaBase searchCriteria = null) { if (reports.Any()) { _logger.ProgressInfo("Processing {0} releases", reports.Count); } else { _logger.ProgressInfo("No results found"); } var reportNumber = 1; foreach (var report in reports) { DownloadDecision decision = null; _logger.ProgressTrace("Processing release {0}/{1}", reportNumber, reports.Count); _logger.Debug("Processing release '{0}' from '{1}'", report.Title, report.Indexer); try { var parsedBookInfo = Parser.Parser.ParseBookTitle(report.Title); if (parsedBookInfo == null) { if (searchCriteria != null) { parsedBookInfo = Parser.Parser.ParseBookTitleWithSearchCriteria(report.Title, searchCriteria.Author, searchCriteria.Books); } else { // try parsing fuzzy parsedBookInfo = _parsingService.ParseAlbumTitleFuzzy(report.Title); } } if (parsedBookInfo != null && !parsedBookInfo.AuthorName.IsNullOrWhiteSpace()) { var remoteBook = _parsingService.Map(parsedBookInfo, searchCriteria); // try parsing again using the search criteria, in case it parsed but parsed incorrectly if ((remoteBook.Author == null || remoteBook.Books.Empty()) && searchCriteria != null) { _logger.Debug("Author/Book null for {0}, reparsing with search criteria", report.Title); var parsedBookInfoWithCriteria = Parser.Parser.ParseBookTitleWithSearchCriteria(report.Title, searchCriteria.Author, searchCriteria.Books); if (parsedBookInfoWithCriteria != null && parsedBookInfoWithCriteria.AuthorName.IsNotNullOrWhiteSpace()) { remoteBook = _parsingService.Map(parsedBookInfoWithCriteria, searchCriteria); } } remoteBook.Release = report; if (remoteBook.Author == null) { decision = new DownloadDecision(remoteBook, new Rejection("Unknown Author")); // shove in the searched author in case of forced download in interactive search if (searchCriteria != null) { remoteBook.Author = searchCriteria.Author; remoteBook.Books = searchCriteria.Books; } } else if (remoteBook.Books.Empty()) { decision = new DownloadDecision(remoteBook, new Rejection("Unable to parse books from release name")); if (searchCriteria != null) { remoteBook.Books = searchCriteria.Books; } } else { _aggregationService.Augment(remoteBook); remoteBook.DownloadAllowed = remoteBook.Books.Any(); decision = GetDecisionForReport(remoteBook, searchCriteria); } } if (searchCriteria != null) { if (parsedBookInfo == null) { parsedBookInfo = new ParsedBookInfo { Quality = QualityParser.ParseQuality(report.Title) }; } if (parsedBookInfo.AuthorName.IsNullOrWhiteSpace()) { var remoteBook = new RemoteBook { Release = report, ParsedBookInfo = parsedBookInfo }; decision = new DownloadDecision(remoteBook, new Rejection("Unable to parse release")); } } } catch (Exception e) { _logger.Error(e, "Couldn't process release."); var remoteBook = new RemoteBook { Release = report }; decision = new DownloadDecision(remoteBook, new Rejection("Unexpected error processing release")); } reportNumber++; if (decision != null) { if (decision.Rejections.Any()) { _logger.Debug("Release rejected for the following reasons: {0}", string.Join(", ", decision.Rejections)); } else { _logger.Debug("Release accepted"); } yield return(decision); } } }