1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-10-05 23:57:20 +02:00

started rss cleanup

This commit is contained in:
kay.one 2011-04-03 20:50:12 -07:00
parent 7a16a907a4
commit 62b2cd510f
43 changed files with 188 additions and 217 deletions

View File

@ -6,6 +6,7 @@
using MbUnit.Framework.ContractVerifiers; using MbUnit.Framework.ContractVerifiers;
using Moq; using Moq;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using SubSonic.Repository; using SubSonic.Repository;

View File

@ -7,6 +7,7 @@
using MbUnit.Framework.ContractVerifiers; using MbUnit.Framework.ContractVerifiers;
using Moq; using Moq;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using SubSonic.Repository; using SubSonic.Repository;

View File

@ -11,6 +11,7 @@
using Ninject.Moq; using Ninject.Moq;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
using SubSonic.Repository; using SubSonic.Repository;

View File

@ -9,6 +9,7 @@
using NLog; using NLog;
using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using SubSonic.DataProviders; using SubSonic.DataProviders;
using SubSonic.Repository; using SubSonic.Repository;
using TvdbLib; using TvdbLib;

View File

@ -8,6 +8,7 @@
using Moq; using Moq;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using Rss; using Rss;
namespace NzbDrone.Core.Test namespace NzbDrone.Core.Test

View File

@ -7,6 +7,7 @@
using MbUnit.Framework.ContractVerifiers; using MbUnit.Framework.ContractVerifiers;
using Moq; using Moq;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using SubSonic.Repository; using SubSonic.Repository;
namespace NzbDrone.Core.Test namespace NzbDrone.Core.Test

View File

@ -8,6 +8,7 @@
using NLog.Targets; using NLog.Targets;
using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Providers.Fakes; using NzbDrone.Core.Providers.Fakes;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;

View File

@ -8,7 +8,7 @@ namespace NzbDrone.Core.Helpers
{ {
public static class SceneNameHelper public static class SceneNameHelper
{ {
private static List<SceneNameModel> _sceneNameMappings = new List<SceneNameModel> private static readonly List<SceneNameModel> SceneNameMappings = new List<SceneNameModel>
{ {
new SceneNameModel { SeriesId = 72546, Name = "CSI" }, new SceneNameModel { SeriesId = 72546, Name = "CSI" },
new SceneNameModel { SeriesId = 73696, Name = "CSI New York" }, new SceneNameModel { SeriesId = 73696, Name = "CSI New York" },
@ -76,7 +76,7 @@ public static class SceneNameHelper
public static int FindByName(string cleanSeriesName) public static int FindByName(string cleanSeriesName)
{ {
var map = _sceneNameMappings.Find(s => Parser.NormalizeTitle(s.Name) == cleanSeriesName); var map = SceneNameMappings.Find(s => Parser.NormalizeTitle(s.Name) == cleanSeriesName);
if (map == null) if (map == null)
return 0; return 0;
@ -88,7 +88,7 @@ public static List<String> FindById(int seriesId)
{ {
List<String> results = new List<string>(); List<String> results = new List<string>();
var maps = _sceneNameMappings.Where(s => s.SeriesId == seriesId); var maps = SceneNameMappings.Where(s => s.SeriesId == seriesId);
foreach (var map in maps) foreach (var map in maps)
results.Add(map.Name); results.Add(map.Name);

View File

@ -1,5 +1,5 @@
using NzbDrone.Core.Repository.Quality; using System;
using SubSonic.SqlGeneration.Schema; using System.Collections.Generic;
namespace NzbDrone.Core.Model namespace NzbDrone.Core.Model
{ {
@ -7,12 +7,12 @@ public class EpisodeParseResult
{ {
internal string SeriesTitle { get; set; } internal string SeriesTitle { get; set; }
internal int SeasonNumber { get; set; } internal int SeasonNumber { get; set; }
internal int EpisodeNumber { get; set; } internal List<int> Episodes { get; set; }
internal int Year { get; set; } internal int Year { get; set; }
public override string ToString() public override string ToString()
{ {
return string.Format("Series:{0} Season:{1} Episode:{2}", SeriesTitle, SeasonNumber, EpisodeNumber); return string.Format("Series:{0} Season:{1} Episode:{2}", SeriesTitle, SeasonNumber, String.Join(",", Episodes));
} }
} }

View File

@ -9,12 +9,9 @@ namespace NzbDrone.Core.Model
{ {
public class NzbInfoModel public class NzbInfoModel
{ {
public string Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string TitleFix { get; set; } public string TitleFix { get; set; }
public NzbSiteModel Site { get; set; }
public Uri Link { get; set; } public Uri Link { get; set; }
public string Description { get; set; }
public bool Proper { get; set; } public bool Proper { get; set; }
public QualityTypes Quality { get; set; } public QualityTypes Quality { get; set; }

View File

@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace NzbDrone.Core.Model
{
public class NzbSiteModel
{
private static readonly IList<NzbSiteModel> Sites = new List<NzbSiteModel>
{
new NzbSiteModel {Name = "newzbin", Url = "newzbin.com", Pattern = @"\d{7,10}"},
new NzbSiteModel {Name = "nzbmatrix", Url = "nzbmatrix.com", Pattern = @"\d{6,10}"},
new NzbSiteModel {Name = "nzbsDotOrg", Url = "nzbs.org", Pattern = @"\d{5,10}"},
new NzbSiteModel {Name = "nzbsrus", Url = "nzbsrus.com", Pattern = @"\d{6,10}"},
new NzbSiteModel {Name = "lilx", Url = "lilx.net", Pattern = @"\d{6,10}"},
};
public string Name { get; set; }
public string Pattern { get; set; }
public string Url { get; set; }
// TODO: use HttpUtility.ParseQueryString();
// https://nzbmatrix.com/api-nzb-download.php?id=626526
public string ParseId(string url)
{
return Regex.Match(url, Pattern).Value;
}
public static NzbSiteModel Parse(string url)
{
return Sites.Where(site => url.Contains(site.Url)).SingleOrDefault() ??
new NzbSiteModel { Name = "unknown", Pattern = @"\d{6,10}" };
}
}
}

View File

@ -1,21 +0,0 @@
using System.Collections.Generic;
using SubSonic.SqlGeneration.Schema;
namespace NzbDrone.Core.Repository
{
public class Season
{
[SubSonicPrimaryKey(false)]
public virtual long SeasonId { get; set; }
public long SeriesId { get; set; }
public int SeasonNumber { get; set; }
public bool Monitored { get; set; }
public string Folder { get; set; }
[SubSonicToManyRelation]
public virtual List<Episode> Episodes { get; private set; }
[SubSonicToOneRelation(ThisClassContainsJoinKey = true)]
public virtual Series Series { get; private set; }
}
}

View File

@ -1,15 +0,0 @@
using NzbDrone.Core.Repository.Quality;
using SubSonic.SqlGeneration.Schema;
namespace NzbDrone.Core.Model
{
public class SeasonModel
{
public string SeriesTitle { get; set; }
public int SeriesId { get; set; }
public int SeasonNumber { get; set; }
public QualityTypes Quality { get; set; }
public long Size { get; set; }
public bool Proper { get; set; }
}
}

View File

@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model
{
public class SeriesMappingModel
{
public string Path { get; set; }
public int TvDbId { get; set; }
public int QualityProfileId { get; set; }
}
}

View File

@ -168,21 +168,19 @@
<Compile Include="Instrumentation\SubsonicTarget.cs" /> <Compile Include="Instrumentation\SubsonicTarget.cs" />
<Compile Include="Instrumentation\ExceptioneerTarget.cs" /> <Compile Include="Instrumentation\ExceptioneerTarget.cs" />
<Compile Include="Instrumentation\NlogWriter.cs" /> <Compile Include="Instrumentation\NlogWriter.cs" />
<Compile Include="Model\SeasonModel.cs" />
<Compile Include="Model\SeasonParseResult.cs" />
<Compile Include="Model\EpisodeParseResult.cs" />
<Compile Include="Model\EpisodeModel.cs" /> <Compile Include="Model\EpisodeModel.cs" />
<Compile Include="Model\EpisodeParseResult.cs" />
<Compile Include="Model\EpisodeRenameModel.cs" /> <Compile Include="Model\EpisodeRenameModel.cs" />
<Compile Include="Model\EpisodeSortingType.cs" /> <Compile Include="Model\EpisodeSortingType.cs" />
<Compile Include="Model\EpisodeStatusType.cs" /> <Compile Include="Model\EpisodeStatusType.cs" />
<Compile Include="Model\FeedInfoModel.cs" /> <Compile Include="Model\FeedInfoModel.cs" />
<Compile Include="Model\NzbInfoModel.cs" /> <Compile Include="Model\NzbInfoModel.cs" />
<Compile Include="Model\NzbSiteModel.cs" />
<Compile Include="Model\SabnzbdPriorityType.cs" /> <Compile Include="Model\SabnzbdPriorityType.cs" />
<Compile Include="Model\SceneNameModel.cs" /> <Compile Include="Model\SceneNameModel.cs" />
<Compile Include="Model\SeriesMappingModel.cs" /> <Compile Include="Model\SeasonParseResult.cs" />
<Compile Include="Model\UpcomingEpisodesModel.cs" /> <Compile Include="Model\UpcomingEpisodesModel.cs" />
<Compile Include="Providers\BacklogProvider.cs" /> <Compile Include="Providers\BacklogProvider.cs" />
<Compile Include="Providers\FeedProviderBase.cs" />
<Compile Include="Providers\ExternalNotificationProvider.cs" /> <Compile Include="Providers\ExternalNotificationProvider.cs" />
<Compile Include="Providers\HistoryProvider.cs" /> <Compile Include="Providers\HistoryProvider.cs" />
<Compile Include="Providers\IBacklogProvider.cs" /> <Compile Include="Providers\IBacklogProvider.cs" />
@ -196,7 +194,7 @@
<Compile Include="Providers\IRootDirProvider.cs" /> <Compile Include="Providers\IRootDirProvider.cs" />
<Compile Include="Providers\IRssItemProcessingProvider.cs" /> <Compile Include="Providers\IRssItemProcessingProvider.cs" />
<Compile Include="Providers\IRssSyncProvider.cs" /> <Compile Include="Providers\IRssSyncProvider.cs" />
<Compile Include="Providers\IRssProvider.cs" /> <Compile Include="Providers\Core\IRssProvider.cs" />
<Compile Include="Providers\ITimerProvider.cs" /> <Compile Include="Providers\ITimerProvider.cs" />
<Compile Include="Providers\IUpcomingEpisodesProvider.cs" /> <Compile Include="Providers\IUpcomingEpisodesProvider.cs" />
<Compile Include="Providers\IXbmcProvider.cs" /> <Compile Include="Providers\IXbmcProvider.cs" />
@ -206,7 +204,7 @@
<Compile Include="Providers\RootDirProvider.cs" /> <Compile Include="Providers\RootDirProvider.cs" />
<Compile Include="Providers\RssItemProcessingProvider.cs" /> <Compile Include="Providers\RssItemProcessingProvider.cs" />
<Compile Include="Providers\RssSyncProvider.cs" /> <Compile Include="Providers\RssSyncProvider.cs" />
<Compile Include="Providers\RssProvider.cs" /> <Compile Include="Providers\Core\RssProvider.cs" />
<Compile Include="Providers\TimerProvider.cs" /> <Compile Include="Providers\TimerProvider.cs" />
<Compile Include="Providers\UpcomingEpisodesProvider.cs" /> <Compile Include="Providers\UpcomingEpisodesProvider.cs" />
<Compile Include="Providers\XbmcProvider.cs" /> <Compile Include="Providers\XbmcProvider.cs" />
@ -224,12 +222,12 @@
<Compile Include="Providers\SyncProvider.cs" /> <Compile Include="Providers\SyncProvider.cs" />
<Compile Include="Model\Notification\ProgressNotification.cs" /> <Compile Include="Model\Notification\ProgressNotification.cs" />
<Compile Include="Providers\NotificationProvider.cs" /> <Compile Include="Providers\NotificationProvider.cs" />
<Compile Include="Providers\ConfigProvider.cs" /> <Compile Include="Providers\Core\ConfigProvider.cs" />
<Compile Include="Providers\EpisodeProvider.cs" /> <Compile Include="Providers\EpisodeProvider.cs" />
<Compile Include="Providers\HttpProvider.cs" /> <Compile Include="Providers\Core\HttpProvider.cs" />
<Compile Include="Providers\IDownloadProvider.cs" /> <Compile Include="Providers\IDownloadProvider.cs" />
<Compile Include="Providers\IEpisodeProvider.cs" /> <Compile Include="Providers\IEpisodeProvider.cs" />
<Compile Include="Providers\IHttpProvider.cs" /> <Compile Include="Providers\Core\IHttpProvider.cs" />
<Compile Include="Providers\ISeasonProvider.cs" /> <Compile Include="Providers\ISeasonProvider.cs" />
<Compile Include="Providers\ISeriesProvider.cs" /> <Compile Include="Providers\ISeriesProvider.cs" />
<Compile Include="Providers\ITvDbProvider.cs" /> <Compile Include="Providers\ITvDbProvider.cs" />
@ -247,9 +245,9 @@
<Compile Include="Repository\Series.cs" /> <Compile Include="Repository\Series.cs" />
<Compile Include="CentralDispatch.cs" /> <Compile Include="CentralDispatch.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Providers\DiskProvider.cs" /> <Compile Include="Providers\Core\DiskProvider.cs" />
<Compile Include="Providers\IConfigProvider.cs" /> <Compile Include="Providers\Core\IConfigProvider.cs" />
<Compile Include="Providers\IDiskProvider.cs" /> <Compile Include="Providers\Core\IDiskProvider.cs" />
<Compile Include="Providers\SeriesProvider.cs" /> <Compile Include="Providers\SeriesProvider.cs" />
<Compile Include="Providers\TvDbProvider.cs" /> <Compile Include="Providers\TvDbProvider.cs" />
</ItemGroup> </ItemGroup>

View File

@ -34,11 +34,11 @@ internal static class Parser
/// </summary> /// </summary>
/// <param name="title">Title of the report</param> /// <param name="title">Title of the report</param>
/// <returns>List of episodes contained to the post</returns> /// <returns>List of episodes contained to the post</returns>
internal static List<EpisodeParseResult> ParseEpisodeInfo(string title) internal static EpisodeParseResult ParseEpisodeInfo(string title)
{ {
Logger.Trace("Parsing string '{0}'", title); Logger.Trace("Parsing string '{0}'", title);
var result = new List<EpisodeParseResult>(); var result = new EpisodeParseResult();
foreach (var regex in ReportTitleRegex) foreach (var regex in ReportTitleRegex)
{ {
@ -55,22 +55,22 @@ internal static List<EpisodeParseResult> ParseEpisodeInfo(string title)
year = 0; year = 0;
} }
foreach (Match matchGroup in match)
{
var parsedEpisode = new EpisodeParseResult var parsedEpisode = new EpisodeParseResult
{ {
SeriesTitle = seriesName, SeriesTitle = seriesName,
SeasonNumber = Convert.ToInt32(matchGroup.Groups["season"].Value), SeasonNumber = Convert.ToInt32(match[0].Groups["season"].Value),
EpisodeNumber = Convert.ToInt32(matchGroup.Groups["episode"].Value), Year = year,
Year = year Episodes = new List<int>()
}; };
foreach (Match matchGroup in match)
{
parsedEpisode.Episodes.Add(Convert.ToInt32(matchGroup.Groups["episode"].Value));
result.Add(parsedEpisode); }
Logger.Trace("Episode Parsed. {0}", parsedEpisode); Logger.Trace("Episode Parsed. {0}", parsedEpisode);
}
break; //Break out of the for loop, we don't want to process every REGEX for each item otherwise we'll get duplicates break; //Break out of the for loop, we don't want to process every REGEX for each item otherwise we'll get duplicates
} }
} }
@ -257,14 +257,11 @@ public static string NormalizePath(string path)
public static NzbInfoModel ParseNzbInfo(FeedInfoModel feed, RssItem item) public static NzbInfoModel ParseNzbInfo(FeedInfoModel feed, RssItem item)
{ {
NzbSiteModel site = NzbSiteModel.Parse(feed.Url.ToLower());
return new NzbInfoModel return new NzbInfoModel
{ {
Id = site.ParseId(item.Link.ToString()),
Title = item.Title, Title = item.Title,
Site = site, Link = item.Link
Link = item.Link,
Description = item.Description
}; };
} }
} }

View File

@ -8,6 +8,7 @@
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using Rss; using Rss;

View File

@ -3,7 +3,7 @@
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using SubSonic.Repository; using SubSonic.Repository;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public class ConfigProvider : IConfigProvider public class ConfigProvider : IConfigProvider
{ {

View File

@ -1,7 +1,7 @@
using System; using System;
using System.IO; using System.IO;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public class DiskProvider : IDiskProvider public class DiskProvider : IDiskProvider
{ {

View File

@ -2,7 +2,7 @@
using System.Net; using System.Net;
using NLog; using NLog;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
internal class HttpProvider : IHttpProvider internal class HttpProvider : IHttpProvider
{ {

View File

@ -1,6 +1,6 @@
using System; using System;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public interface IConfigProvider public interface IConfigProvider
{ {

View File

@ -1,7 +1,7 @@
using System; using System;
using System.IO; using System.IO;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public interface IDiskProvider public interface IDiskProvider
{ {

View File

@ -1,4 +1,4 @@
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public interface IHttpProvider public interface IHttpProvider
{ {

View File

@ -1,11 +1,8 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using Rss; using Rss;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public interface IRssProvider public interface IRssProvider
{ {

View File

@ -1,12 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using NLog; using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using Rss; using Rss;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers.Core
{ {
public class RssProvider : IRssProvider public class RssProvider : IRssProvider
{ {

View File

@ -5,6 +5,7 @@
using NLog; using NLog;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers

View File

@ -0,0 +1,85 @@
using System;
using System.ServiceModel.Syndication;
using System.Xml;
using NLog;
using NzbDrone.Core.Model;
using NzbDrone.Core.Repository;
namespace NzbDrone.Core.Providers
{
abstract class FeedProviderBase
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
/// <summary>
/// Gets the source URL for the feed
/// </summary>
protected abstract string[] URL { get; }
/// <summary>
/// Gets the name for this feed
/// </summary>
protected abstract string Name { get; }
public void Fetch()
{
Logger.Info("Fetching feeds from " + Name);
foreach (var url in URL)
{
var feed = SyndicationFeed.Load(XmlReader.Create(url)).Items;
foreach (var item in feed)
{
ProcessItem(item);
}
}
Logger.Info("Finished processing feeds from " + Name);
}
private void ProcessItem(SyndicationItem item)
{
var parseResult = ParseFeed(item);
}
public void DownloadIfWanted(NzbInfoModel nzb, Indexer indexer)
{
if (nzb.IsPassworded())
{
Logger.Debug("Skipping Passworded Report {0}", nzb.Title);
return;
}
var episodeParseResults = Parser.ParseEpisodeInfo(nzb.Title);
if (episodeParseResults.Episodes.Count > 0)
{
//ProcessStandardItem(nzb, indexer, episodeParseResults);
return;
}
//Handles Full Season NZBs
var seasonParseResult = Parser.ParseSeasonInfo(nzb.Title);
if (seasonParseResult != null)
{
//ProcessFullSeasonItem(nzb, indexer, seasonParseResult);
return;
}
Logger.Debug("Unsupported Title: {0}", nzb.Title);
}
protected EpisodeParseResult ParseFeed(SyndicationItem item)
{
return Parser.ParseEpisodeInfo(item.Title.ToString());
}
}
}

View File

@ -12,6 +12,6 @@ public interface IRssItemProcessingProvider
//This interface will contain methods to process individual RSS Feed Items (Queue if wanted) //This interface will contain methods to process individual RSS Feed Items (Queue if wanted)
void DownloadIfWanted(NzbInfoModel nzb, Indexer indexer); void DownloadIfWanted(NzbInfoModel nzb, Indexer indexer);
string GetTitleFix(List<EpisodeParseResult> episodes, int seriesId); string GetTitleFix(EpisodeParseResult episodes, int seriesId);
} }
} }

View File

@ -5,6 +5,7 @@
using System.Text; using System.Text;
using NLog; using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using SubSonic.Repository; using SubSonic.Repository;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;

View File

@ -6,6 +6,7 @@
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using NLog; using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using SubSonic.Repository; using SubSonic.Repository;
@ -76,18 +77,17 @@ public EpisodeFile ImportFile(Series series, string filePath)
//Stores the list of episodes to add to the EpisodeFile //Stores the list of episodes to add to the EpisodeFile
var episodes = new List<Episode>(); var episodes = new List<Episode>();
foreach (var parsedEpisode in episodesInFile) foreach (var episodeNumber in episodesInFile.Episodes)
{ {
EpisodeParseResult closureEpisode = parsedEpisode; var episode = _episodeProvider.GetEpisode(series.SeriesId, episodesInFile.SeasonNumber, episodeNumber);
var episode = _episodeProvider.GetEpisode(series.SeriesId, closureEpisode.SeasonNumber,
closureEpisode.EpisodeNumber);
if (episode != null) if (episode != null)
{ {
episodes.Add(episode); episodes.Add(episode);
} }
else else
Logger.Warn("Unable to find Series:{0} Season:{1} Episode:{2} in the database. File:{3}", series.Title, closureEpisode.SeasonNumber, closureEpisode.EpisodeNumber, filePath); Logger.Warn("Unable to find Series:{0} Season:{1} Episode:{2} in the database. File:{3}", series.Title, episodesInFile.SeasonNumber, episodeNumber, filePath);
} }
//Return null if no Episodes exist in the DB for the parsed episodes from file //Return null if no Episodes exist in the DB for the parsed episodes from file

View File

@ -5,6 +5,7 @@
using System.Text; using System.Text;
using System.Xml.Linq; using System.Xml.Linq;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
{ {

View File

@ -7,6 +7,7 @@
using NLog; using NLog;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers

View File

@ -6,6 +6,7 @@
using NLog; using NLog;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
@ -53,7 +54,7 @@ public void DownloadIfWanted(NzbInfoModel nzb, Indexer indexer)
var episodeParseResults = Parser.ParseEpisodeInfo(nzb.Title); var episodeParseResults = Parser.ParseEpisodeInfo(nzb.Title);
if (episodeParseResults.Count() > 0) if (episodeParseResults.Episodes.Count() > 0)
{ {
ProcessStandardItem(nzb, indexer, episodeParseResults); ProcessStandardItem(nzb, indexer, episodeParseResults);
return; return;
@ -78,7 +79,7 @@ public void DownloadIfWanted(NzbInfoModel nzb, Indexer indexer)
} }
} }
public string GetTitleFix(List<EpisodeParseResult> episodes, int seriesId) public string GetTitleFix(EpisodeParseResult episodes, int seriesId)
{ {
var series = _seriesProvider.GetSeries(seriesId); var series = _seriesProvider.GetSeries(seriesId);
@ -86,16 +87,16 @@ public string GetTitleFix(List<EpisodeParseResult> episodes, int seriesId)
string episodeNumbers = String.Empty; string episodeNumbers = String.Empty;
string episodeTitles = String.Empty; string episodeTitles = String.Empty;
foreach (var episode in episodes) foreach (var episode in episodes.Episodes)
{ {
var episodeInDb = _episodeProvider.GetEpisode(seriesId, episode.SeasonNumber, episode.EpisodeNumber); var episodeInDb = _episodeProvider.GetEpisode(seriesId, episodes.SeasonNumber, episode);
if (episodeInDb == null) if (episodeInDb == null)
{ {
//Todo: Handle this some other way? //Todo: Handle this some other way?
Logger.Debug("Episode Not found in Database, Fake it..."); Logger.Debug("Episode Not found in Database, Fake it...");
//return String.Format("{0} - {1:00}x{2}", series.Title, episode.SeasonNumber, episode.EpisodeNumber); //return String.Format("{0} - {1:00}x{2}", series.Title, episode.SeasonNumber, episode.EpisodeNumber);
episodeInDb = new Episode { EpisodeNumber = episode.EpisodeNumber, Title = "TBA" }; episodeInDb = new Episode { EpisodeNumber = episode, Title = "TBA" };
} }
seasonNumber = episodeInDb.SeasonNumber; seasonNumber = episodeInDb.SeasonNumber;
@ -110,23 +111,23 @@ public string GetTitleFix(List<EpisodeParseResult> episodes, int seriesId)
#endregion #endregion
private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, List<EpisodeParseResult> episodeParseResults) private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, EpisodeParseResult episodeParseResults)
{ {
//Will try to match via NormalizeTitle, if that fails it will look for a scene name and do a lookup for your shows //Will try to match via NormalizeTitle, if that fails it will look for a scene name and do a lookup for your shows
var series = _seriesProvider.FindSeries(episodeParseResults[0].SeriesTitle); var series = _seriesProvider.FindSeries(episodeParseResults.SeriesTitle);
if (series == null) if (series == null)
{ {
//If we weren't able to find a title using the clean name, lets try again looking for a scene name //If we weren't able to find a title using the clean name, lets try again looking for a scene name
var sceneId = SceneNameHelper.FindByName(episodeParseResults[0].SeriesTitle); var sceneId = SceneNameHelper.FindByName(episodeParseResults.SeriesTitle);
if (sceneId != 0) if (sceneId != 0)
series = _seriesProvider.GetSeries(sceneId); series = _seriesProvider.GetSeries(sceneId);
if (series == null) if (series == null)
{ {
Logger.Debug("Show is not being watched: {0}", episodeParseResults[0].SeriesTitle); Logger.Debug("Show is not being watched: {0}", episodeParseResults.SeriesTitle);
return; return;
} }
} }
@ -137,7 +138,7 @@ private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, List<Episode
nzb.Quality = Parser.ParseQuality(nzb.Title); nzb.Quality = Parser.ParseQuality(nzb.Title);
//Loop through the list of the episodeParseResults to ensure that all the episodes are needed //Loop through the list of the episodeParseResults to ensure that all the episodes are needed
foreach (var episode in episodeParseResults) foreach (var episode in episodeParseResults.Episodes)
{ {
//IsEpisodeWanted? //IsEpisodeWanted?
var episodeModel = new EpisodeModel(); var episodeModel = new EpisodeModel();
@ -145,13 +146,13 @@ private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, List<Episode
episodeModel.SeriesId = series.SeriesId; episodeModel.SeriesId = series.SeriesId;
episodeModel.SeriesTitle = series.Title; episodeModel.SeriesTitle = series.Title;
episodeModel.Quality = nzb.Quality; episodeModel.Quality = nzb.Quality;
episodeModel.SeasonNumber = episode.SeasonNumber; episodeModel.SeasonNumber = episodeParseResults.SeasonNumber;
episodeModel.EpisodeNumber = episode.EpisodeNumber; episodeModel.EpisodeNumber = episode;
if (!_episodeProvider.IsNeeded(episodeModel)) if (!_episodeProvider.IsNeeded(episodeModel))
return; return;
var titleFix = GetTitleFix(new List<EpisodeParseResult> { episode }, episodeModel.SeriesId); var titleFix = GetTitleFix(episodeParseResults, episodeModel.SeriesId);
titleFix = String.Format("{0} [{1}]", titleFix, nzb.Quality); //Add Quality to the titleFix titleFix = String.Format("{0} [{1}]", titleFix, nzb.Quality); //Add Quality to the titleFix
//If it is a PROPER we want to put PROPER in the titleFix //If it is a PROPER we want to put PROPER in the titleFix
@ -172,15 +173,15 @@ private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, List<Episode
if (Convert.ToBoolean(_configProvider.GetValue("UseBlackHole", true, true))) if (Convert.ToBoolean(_configProvider.GetValue("UseBlackHole", true, true)))
{ {
if (DownloadNzb(nzb)) //if (DownloadNzb(nzb))
AddToHistory(episodeParseResults, series, nzb, indexer); //AddToHistory(episodeParseResults, nzb, indexer);
} }
//Send it to SABnzbd //Send it to SABnzbd
else else
{ {
//Only need to do this check if it contains more than one episode (because we already checked individually before) //Only need to do this check if it contains more than one episode (because we already checked individually before)
if (episodeParseResults.Count > 1) if (episodeParseResults.Episodes.Count > 1)
{ {
if (_sabProvider.IsInQueue(nzb.TitleFix)) if (_sabProvider.IsInQueue(nzb.TitleFix))
return; return;
@ -188,15 +189,11 @@ private void ProcessStandardItem(NzbInfoModel nzb, Indexer indexer, List<Episode
if (indexer.IndexerName != "Newzbin") if (indexer.IndexerName != "Newzbin")
{ {
if (_sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix)) //if (_sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix))
AddToHistory(episodeParseResults, series, nzb, indexer); //AddToHistory(_episodeProvider.GetEpisode(episodeParseResults.), series, nzb, indexer);
} }
else
{
if (_sabProvider.AddById(nzb.Id, nzb.TitleFix))
AddToHistory(episodeParseResults, series, nzb, indexer);
}
} }
} }
@ -285,8 +282,7 @@ private void ProcessFullSeasonItem(NzbInfoModel nzb, Indexer indexer, SeasonPars
{ {
if (DownloadNzb(nzb)) if (DownloadNzb(nzb))
{ {
var episodeParseResults = GetEpisodeParseList(season.Episodes); AddToHistory(season.Episodes, nzb, indexer);
AddToHistory(episodeParseResults, series, nzb, indexer);
} }
} }
@ -300,54 +296,26 @@ private void ProcessFullSeasonItem(NzbInfoModel nzb, Indexer indexer, SeasonPars
{ {
if (_sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix)) if (_sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix))
{ {
var episodeParseResults = GetEpisodeParseList(season.Episodes); AddToHistory(season.Episodes, nzb, indexer);
AddToHistory(episodeParseResults, series, nzb, indexer);
} }
} }
else
{
if (_sabProvider.AddById(nzb.Id, nzb.TitleFix))
{
var episodeParseResults = GetEpisodeParseList(season.Episodes);
AddToHistory(episodeParseResults, series, nzb, indexer);
}
}
} }
} }
//Possibly grab the whole season if a certain % of the season is missing, rather than for 1 or 2 episodes //Possibly grab the whole season if a certain % of the season is missing, rather than for 1 or 2 episodes
} }
private List<EpisodeParseResult> GetEpisodeParseList(List<Episode> episodes) private void AddToHistory(IEnumerable<Episode> episodes, NzbInfoModel nzb, Indexer indexer)
{ {
var episodeParseResults = new List<EpisodeParseResult>();
episodeParseResults.AddRange(
episodes.Select(
e =>
new EpisodeParseResult { EpisodeNumber = e.EpisodeNumber, SeasonNumber = e.SeasonNumber }));
return episodeParseResults;
}
private void AddToHistory(List<EpisodeParseResult> episodeParseResults, Series series, NzbInfoModel nzb, Indexer indexer)
{
//We need to loop through the episodeParseResults so each episode in the NZB is properly handled
foreach (var epr in episodeParseResults)
{
var episode = _episodeProvider.GetEpisode(series.SeriesId, epr.SeasonNumber, epr.EpisodeNumber);
if (episode == null)
{
//Not sure how we got this far, so lets throw an exception
throw new ArgumentOutOfRangeException();
}
//Set episode status to grabbed //Set episode status to grabbed
episode.Status = EpisodeStatusType.Grabbed; //episode.Status = EpisodeStatusType.Grabbed;
//Add to History //Add to History
foreach (var episode in episodes)
{
var history = new History(); var history = new History();
history.Date = DateTime.Now; history.Date = DateTime.Now;
history.EpisodeId = episode.EpisodeId; history.EpisodeId = episode.EpisodeId;

View File

@ -7,6 +7,7 @@
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
using Rss; using Rss;

View File

@ -3,6 +3,7 @@
using System.Web; using System.Web;
using System.Xml.Linq; using System.Xml.Linq;
using NLog; using NLog;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
{ {

View File

@ -4,6 +4,7 @@
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using NLog; using NLog;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
using SubSonic.Repository; using SubSonic.Repository;

View File

@ -7,6 +7,7 @@
using NLog; using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
{ {

View File

@ -6,6 +6,7 @@
using System.Xml.Linq; using System.Xml.Linq;
using NLog; using NLog;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
{ {

View File

@ -5,6 +5,7 @@
using System.Web; using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Web.Models; using NzbDrone.Web.Models;
namespace NzbDrone.Web.Controllers namespace NzbDrone.Web.Controllers

View File

@ -7,6 +7,7 @@
using NLog; using NLog;
using NzbDrone.Core; using NzbDrone.Core;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Web.Controllers namespace NzbDrone.Web.Controllers
{ {

View File

@ -8,6 +8,7 @@
using System.Web.Mvc; using System.Web.Mvc;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
using NzbDrone.Web.Models; using NzbDrone.Web.Models;

View File

@ -9,6 +9,7 @@
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
using NzbDrone.Web.Models; using NzbDrone.Web.Models;

View File

@ -27,7 +27,6 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Any CPU.ActiveCfg = Debug|x86 {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Any CPU.ActiveCfg = Debug|x86
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Mixed Platforms.Build.0 = Debug|x86
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x64.ActiveCfg = Debug|x86 {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x64.ActiveCfg = Debug|x86
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.ActiveCfg = Debug|x86 {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.ActiveCfg = Debug|x86
{D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.Build.0 = Debug|x86 {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.Build.0 = Debug|x86
@ -56,7 +55,6 @@ Global
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Any CPU.Build.0 = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x64.ActiveCfg = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x64.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|Any CPU
{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|Any CPU {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|Any CPU
@ -69,7 +67,6 @@ Global
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Any CPU.Build.0 = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x64.ActiveCfg = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x64.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|Any CPU
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|Any CPU
@ -81,7 +78,6 @@ Global
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|x86.ActiveCfg = Release|Any CPU {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|x86.ActiveCfg = Release|Any CPU
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|Any CPU.ActiveCfg = Debug|x86 {0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|Any CPU.ActiveCfg = Debug|x86
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|Mixed Platforms.Build.0 = Debug|x86
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x64.ActiveCfg = Debug|x86 {0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x64.ActiveCfg = Debug|x86
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x86.ActiveCfg = Debug|x86 {0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x86.ActiveCfg = Debug|x86
{0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x86.Build.0 = Debug|x86 {0C679573-736D-4F77-B934-FD8931AC1AA1}.Debug|x86.Build.0 = Debug|x86