From c40f18e66f482d77c9e5e5ae0fc611e482903a3c Mon Sep 17 00:00:00 2001 From: markus101 Date: Sun, 30 Jan 2011 17:30:59 -0800 Subject: [PATCH] Fixed REGEX for episode parsing so it would correctly parse shows with a year in the title. Fixed a config saving issue in the SettingsController. Added bindings in Central dispatch for SabProvider and HttpProvider --- NzbDrone.Core/CentralDispatch.cs | 8 +- NzbDrone.Core/NzbDrone.Core.csproj | 2 + NzbDrone.Core/Parser.cs | 2 +- NzbDrone.Core/Providers/RssSyncProvider.cs | 87 +++++++++++++++++-- NzbDrone.Web/Controllers/SeriesController.cs | 10 ++- .../Controllers/SettingsController.cs | 26 ++++-- NzbDrone.Web/Models/SettingsModels.cs | 2 +- NzbDrone.Web/Views/Series/index.aspx | 1 + 8 files changed, 118 insertions(+), 20 deletions(-) diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index a19096bef..39f82cd85 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -56,6 +56,8 @@ namespace NzbDrone.Core _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); + _kernel.Bind().To(); + _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); @@ -155,9 +157,9 @@ namespace NzbDrone.Core { //Setup the default providers in the Providers table - string nzbMatrixRss = "http://rss.nzbmatrix.com/rss.php?page=download&username=USERNAME&apikey=APIKEY&subcat=6&english=1"; - string nzbsOrgRss = "http://nzbs.org/rss.php?type=1&dl=1&num=100&i=UID&h=HASH"; - string nzbsrusRss = "http://www.nzbsrus.com/rssfeed.php?cat=91,75&i=UID&h=HASH"; + string nzbMatrixRss = "http://rss.nzbmatrix.com/rss.php?page=download&username={USERNAME}&apikey={APIKEY}&subcat=6&english=1"; + string nzbsOrgRss = "http://nzbs.org/rss.php?type=1&dl=1&num=100&i={UID}&h={HASH}"; + string nzbsrusRss = "http://www.nzbsrus.com/rssfeed.php?cat=91,75&i={UID}&h={HASH}"; var nzbMatrixIndexer = new Indexer { diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index fcd5a170e..aecdfacc6 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -173,8 +173,10 @@ + + diff --git a/NzbDrone.Core/Parser.cs b/NzbDrone.Core/Parser.cs index d55506e60..b3104a4f0 100644 --- a/NzbDrone.Core/Parser.cs +++ b/NzbDrone.Core/Parser.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core private static readonly Regex[] ReportTitleRegex = new[] { - new Regex(@"(?.+?)?\W(S)?(?<season>\d+)\w(?<episode>\d+)\W(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled) + new Regex(@"(?<title>.+?)?\W(S)?(?<season>\d+)[EeXx](?<episode>\d+)\W(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled) }; private static readonly Regex NormalizeRegex = new Regex(@"((\s|^)the(\s|$))|((\s|^)and(\s|$))|[^a-z]", RegexOptions.IgnoreCase | RegexOptions.Compiled); diff --git a/NzbDrone.Core/Providers/RssSyncProvider.cs b/NzbDrone.Core/Providers/RssSyncProvider.cs index df9c3bd3f..915347d6e 100644 --- a/NzbDrone.Core/Providers/RssSyncProvider.cs +++ b/NzbDrone.Core/Providers/RssSyncProvider.cs @@ -5,6 +5,8 @@ using System.Text; using System.Threading; using NLog; using NzbDrone.Core.Model; +using NzbDrone.Core.Model.Notification; +using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using Rss; @@ -22,11 +24,15 @@ namespace NzbDrone.Core.Providers private IEpisodeProvider _episode; private IHistoryProvider _history; private IDownloadProvider _sab; + private IConfigProvider _configProvider; + private readonly INotificationProvider _notificationProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private ProgressNotification _rssSyncNotification; + public RssSyncProvider(IIndexerProvider indexerProvider, IRssProvider rss, ISeriesProvider series, - ISeasonProvider season, IEpisodeProvider episode, IHistoryProvider history, IDownloadProvider sab) + ISeasonProvider season, IEpisodeProvider episode, IHistoryProvider history, IDownloadProvider sab, INotificationProvider notificationProvider, IConfigProvider configProvider) { _indexerProvider = indexerProvider; _rss = rss; @@ -35,6 +41,8 @@ namespace NzbDrone.Core.Providers _episode = episode; _history = history; _sab = sab; + _notificationProvider = notificationProvider; + _configProvider = configProvider; } #region IRssSyncProvider Members @@ -69,22 +77,44 @@ namespace NzbDrone.Core.Providers var indexers = _indexerProvider.EnabledIndexers(); - foreach (var i in indexers) + using (_rssSyncNotification = new ProgressNotification("RSS Sync")) { - var indexer = new FeedInfoModel(i.IndexerName, i.RssUrl); + _notificationProvider.Register(_rssSyncNotification); + _rssSyncNotification.CurrentStatus = "Starting Scan"; + _rssSyncNotification.ProgressMax = indexers.Count(); - foreach(RssItem item in _rss.GetFeed(indexer)) + foreach (var i in indexers) { - NzbInfoModel nzb = Parser.ParseNzbInfo(indexer, item); - QueueIfWanted(nzb); + Logger.Info("Starting RSS Sync for: {0}", i.IndexerName); + //Need to insert the users information in the the URL before trying to use it + i.RssUrl = GetUsersUrl(i); //Get the new users specific url (with their information) to use for the Sync + + if (i.RssUrl == null) + { + Logger.Debug("Unable to Sync {0}. User Information has not been configured.", i.IndexerName); + continue; //Skip this indexer + } + + _rssSyncNotification.CurrentStatus = String.Format("Syncing with RSS Feed: {0}", i.IndexerName); + + var indexer = new FeedInfoModel(i.IndexerName, i.RssUrl); + + foreach (RssItem item in _rss.GetFeed(indexer)) + { + NzbInfoModel nzb = Parser.ParseNzbInfo(indexer, item); + QueueIfWanted(nzb); + } } + _rssSyncNotification.CurrentStatus = "RSS Sync Completed"; + Logger.Info("RSS Sync has successfully completed."); + Thread.Sleep(3000); + _rssSyncNotification.Status = ProgressNotificationStatus.Completed; } } private void QueueIfWanted(NzbInfoModel nzb) { - //Do we want this item? - + //Do we want this item? try { if (nzb.IsPassworded()) @@ -162,5 +192,46 @@ namespace NzbDrone.Core.Providers return String.Format("{0} - {1}{2} - {3}", series.Title, seasonNumber, episodeNumbers, episodeTitles); } + + private string GetUsersUrl(Indexer indexer) + { + if (indexer.IndexerName == "NzbMatrix") + { + var nzbMatrixUsername = _configProvider.GetValue("NzbMatrixUsername", String.Empty, false); + var nzbMatrixApiKey = _configProvider.GetValue("NzbMatrixApiKey", String.Empty, false); + + if (!String.IsNullOrEmpty(nzbMatrixUsername) && !String.IsNullOrEmpty(nzbMatrixApiKey)) + return indexer.RssUrl.Replace("{USERNAME}", nzbMatrixUsername).Replace("{APIKEY}", nzbMatrixApiKey); + + //Todo: Perform validation at the config level so a user is unable to enable a provider until user details are provided + return null; //Return Null if Provider is enabled, but user information is not supplied. + } + + if (indexer.IndexerName == "NzbsOrg") + { + var nzbsOrgUId = _configProvider.GetValue("NzbsOrgUId", String.Empty, false); + var nzbsOrgHash = _configProvider.GetValue("NzbsOrgHash", String.Empty, false); + + if (!String.IsNullOrEmpty(nzbsOrgUId) && !String.IsNullOrEmpty(nzbsOrgHash)) + return indexer.RssUrl.Replace("{UID}", nzbsOrgUId).Replace("{HASH}", nzbsOrgHash); + + //Todo: Perform validation at the config level so a user is unable to enable a provider until user details are provided + return null; //Return Null if Provider is enabled, but user information is not supplied. + } + + if (indexer.IndexerName == "NzbsOrg") + { + var nzbsrusUId = _configProvider.GetValue("NzbsrusUId", String.Empty, false); + var nzbsrusHash = _configProvider.GetValue("NzbsrusHash", String.Empty, false); + + if (!String.IsNullOrEmpty(nzbsrusUId) && !String.IsNullOrEmpty(nzbsrusHash)) + return indexer.RssUrl.Replace("{UID}", nzbsrusUId).Replace("{HASH}", nzbsrusHash); + + //Todo: Perform validation at the config level so a user is unable to enable a provider until user details are provided + return null; //Return Null if Provider is enabled, but user information is not supplied. + } + + return indexer.RssUrl; //Currently other providers do not require user information to be substituted, simply return the RssUrl + } } } diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index 9eb42c5dd..54f6b81f6 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -17,14 +17,16 @@ namespace NzbDrone.Web.Controllers private readonly ISeriesProvider _seriesProvider; private readonly IEpisodeProvider _episodeProvider; private readonly ISyncProvider _syncProvider; + private readonly IRssSyncProvider _rssSyncProvider; // // GET: /Series/ - public SeriesController(ISyncProvider syncProvider, ISeriesProvider seriesProvider, IEpisodeProvider episodeProvider) + public SeriesController(ISyncProvider syncProvider, ISeriesProvider seriesProvider, IEpisodeProvider episodeProvider, IRssSyncProvider rssSyncProvider) { _seriesProvider = seriesProvider; _episodeProvider = episodeProvider; _syncProvider = syncProvider; + _rssSyncProvider = rssSyncProvider; } public ActionResult Index() @@ -40,6 +42,12 @@ namespace NzbDrone.Web.Controllers return RedirectToAction("Index"); } + public ActionResult RssSync() + { + _rssSyncProvider.Begin(); + return RedirectToAction("Index"); + } + public ActionResult UnMapped() { diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index 9aeb4c78d..a40b52385 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -149,17 +149,31 @@ namespace NzbDrone.Web.Controllers { try { + //Todo: Only allow indexers to be enabled if user information has been provided foreach (var indexer in data.Indexers) { + indexer.ApiUrl = String.Empty; //TODO: Remove this and use a Real API URL _indexerProvider.Update(indexer); } - _configProvider.SetValue("NzbMatrixUsername", data.NzbMatrixUsername); - _configProvider.SetValue("NzbMatrixApiKey", data.NzbMatrixApiKey); - _configProvider.SetValue("NzbsOrgUId", data.NzbsOrgUId); - _configProvider.SetValue("NzbsOrgHash", data.NzbsOrgHash); - _configProvider.SetValue("NzbsrusUId", data.NzbsrusUId); - _configProvider.SetValue("NzbsrusHash", data.NzbsrusHash); + if (data.NzbMatrixUsername != null) + _configProvider.SetValue("NzbMatrixUsername", data.NzbMatrixUsername); + + if (data.NzbMatrixApiKey != null) + _configProvider.SetValue("NzbMatrixApiKey", data.NzbMatrixApiKey); + + if (data.NzbsOrgUId != null) + _configProvider.SetValue("NzbsOrgUId", data.NzbsOrgUId); + + if (data.NzbsOrgHash != null) + _configProvider.SetValue("NzbsOrgHash", data.NzbsOrgHash); + + if (data.NzbsrusUId != null) + _configProvider.SetValue("NzbsrusUId", data.NzbsrusUId); + + if (data.NzbsrusHash != null) + _configProvider.SetValue("NzbsrusHash", data.NzbsrusHash); + } catch (Exception e) { diff --git a/NzbDrone.Web/Models/SettingsModels.cs b/NzbDrone.Web/Models/SettingsModels.cs index 6b76ab268..01364d678 100644 --- a/NzbDrone.Web/Models/SettingsModels.cs +++ b/NzbDrone.Web/Models/SettingsModels.cs @@ -112,7 +112,7 @@ namespace NzbDrone.Web.Models } [DataType(DataType.Text)] - [DisplayName("Retentions")] + [DisplayName("Retention")] public int Rentention { get; diff --git a/NzbDrone.Web/Views/Series/index.aspx b/NzbDrone.Web/Views/Series/index.aspx index e3c051e23..94b897b42 100644 --- a/NzbDrone.Web/Views/Series/index.aspx +++ b/NzbDrone.Web/Views/Series/index.aspx @@ -9,6 +9,7 @@ <% Html.Telerik().Menu().Name("telerikGrid").Items(items => { items.Add().Text("View Unmapped Folders").Action("Unmapped", "Series"); }) .Items(items => items.Add().Text("Sync With Disk").Action("Sync", "Series")) + .Items(items => items.Add().Text("Start RSS Sync").Action("RssSync", "Series")) .Render(); %> </asp:Content>