diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj
index 76661d1f4..370be78d8 100644
--- a/NzbDrone.Core/NzbDrone.Core.csproj
+++ b/NzbDrone.Core/NzbDrone.Core.csproj
@@ -175,6 +175,7 @@
+
diff --git a/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs
new file mode 100644
index 000000000..46fa1e534
--- /dev/null
+++ b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NLog;
+using NzbDrone.Core.Model;
+using NzbDrone.Core.Model.Notification;
+using NzbDrone.Core.Providers.Indexer;
+
+namespace NzbDrone.Core.Providers.Jobs
+{
+ public class EpisodeSearchJob : IJob
+ {
+ private readonly IEnumerable _indexers;
+ private readonly InventoryProvider _inventoryProvider;
+ private readonly DownloadProvider _downloadProvider;
+ private readonly IndexerProvider _indexerProvider;
+ private readonly EpisodeProvider _episodeProvider;
+
+
+ private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+
+ public EpisodeSearchJob(IEnumerable indexers, InventoryProvider inventoryProvider, DownloadProvider downloadProvider, IndexerProvider indexerProvider, EpisodeProvider episodeProvider)
+ {
+ _indexers = indexers;
+ _inventoryProvider = inventoryProvider;
+ _downloadProvider = downloadProvider;
+ _indexerProvider = indexerProvider;
+ _episodeProvider = episodeProvider;
+ }
+
+ public string Name
+ {
+ get { return "Episode Search"; }
+ }
+
+ public int DefaultInterval
+ {
+ get { return 0; }
+ }
+
+ public void Start(ProgressNotification notification, int targetId)
+ {
+ var reports = new List();
+ var episode = _episodeProvider.GetEpisode(targetId);
+
+
+ foreach (var indexer in _indexers.Where(i => _indexerProvider.GetSettings(i.GetType()).Enable))
+ {
+ try
+ {
+ notification.CurrentMessage = String.Format("Searching for {0} in {1}", episode, indexer.Name);
+ reports.AddRange(indexer.FetchRss());
+ }
+ catch (Exception e)
+ {
+ Logger.ErrorException("An error has occured while fetching items from " + indexer.Name, e);
+ }
+ }
+
+ Logger.Debug("Finished searching all indexers. Total {0}", reports.Count);
+ notification.CurrentMessage = "Proccessing search results";
+
+ foreach (var episodeParseResult in reports.OrderBy(c => c.Quality).ThenBy(c => c.Proper))
+ {
+ try
+ {
+ if (_inventoryProvider.IsNeeded(episodeParseResult))
+ {
+ _downloadProvider.DownloadReport(episodeParseResult);
+ notification.CurrentMessage = String.Format("{0} {1} Added to download queue", episode, episodeParseResult.Quality);
+ return;
+ }
+ }
+ catch (Exception e)
+ {
+ Logger.ErrorException("An error has occured while processing parse result items from " + episodeParseResult, e);
+ }
+ }
+
+
+ Logger.Warn("Unable to find {0} in any of indexers.", episode);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.Core/Repository/Episode.cs b/NzbDrone.Core/Repository/Episode.cs
index 7f15808fe..1dbf66f8d 100644
--- a/NzbDrone.Core/Repository/Episode.cs
+++ b/NzbDrone.Core/Repository/Episode.cs
@@ -70,5 +70,13 @@ namespace NzbDrone.Core.Repository
[SubSonicToManyRelation]
public virtual IList Histories { get; protected set; }
+ public override string ToString()
+ {
+ if (EpisodeNumber == 0)
+ return string.Format("{0} - {1}", Series.Title, AirDate.Date);
+
+ return string.Format("{0} - S{1:00}E{2}", Series.Title, SeasonNumber, EpisodeNumber);
+
+ }
}
}
\ No newline at end of file