more project cleanup.

This commit is contained in:
kay.one 2013-04-07 15:40:13 -07:00 committed by Keivan Beigi
parent 5d7f6fb03b
commit 401ed9a8f6
29 changed files with 154 additions and 315 deletions

View File

@ -0,0 +1,37 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.IndexerTests
{
public class BasicRssParserFixture : CoreTest<BasicRssParser>
{
[TestCase("Castle.2009.S01E14.English.HDTV.XviD-LOL", "LOL")]
[TestCase("Castle 2009 S01E14 English HDTV XviD LOL", "LOL")]
[TestCase("Acropolis Now S05 EXTRAS DVDRip XviD RUNNER", "RUNNER")]
[TestCase("Punky.Brewster.S01.EXTRAS.DVDRip.XviD-RUNNER", "RUNNER")]
[TestCase("2020.NZ.2011.12.02.PDTV.XviD-C4TV", "C4TV")]
[TestCase("The.Office.S03E115.DVDRip.XviD-OSiTV", "OSiTV")]
public void parse_releaseGroup(string title, string expected)
{
BasicRssParser.ParseReleaseGroup(title).Should().Be(expected);
}
[TestCase("5.64 GB", 6055903887)]
[TestCase("5.54 GiB", 5948529705)]
[TestCase("398.62 MiB", 417983365)]
[TestCase("7,162.1MB", 7510006170)]
[TestCase("162.1MB", 169974170)]
[TestCase("398.62 MB", 417983365)]
public void parse_size(string sizeString, long expectedSize)
{
var result = BasicRssParser.GetReportSize(sizeString);
result.Should().Be(expectedSize);
}
}
}

View File

@ -134,6 +134,7 @@
<Compile Include="Framework\DbTest.cs" />
<Compile Include="Framework\NBuilderExtensions.cs" />
<Compile Include="IndexerSearchTests\SearchDefinitionFixture.cs" />
<Compile Include="IndexerTests\BasicRssParserFixture.cs" />
<Compile Include="JobTests\JobRepositoryFixture.cs" />
<Compile Include="JobTests\RenameSeasonJobFixture.cs" />
<Compile Include="DecisionEngineTests\LanguageSpecificationFixture.cs" />

View File

@ -4,6 +4,7 @@ using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Contract;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Model;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
@ -325,8 +326,8 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Burn.Notice.S04E15.Brotherly.Love.GERMAN.DUBBED.WS.WEBRiP.XviD.REPACK-TVP", LanguageType.German)]
public void parse_language(string postTitle, LanguageType language)
{
var result = Parser.ParseLanguage(postTitle);
result.Should().Be(language);
var result = Parser.ParseTitle<ParseResult>(postTitle);
result.Language.Should().Be(language);
}
[TestCase("Hawaii Five 0 S01 720p WEB DL DD5 1 H 264 NT", "Hawaii Five", 1)]
@ -346,19 +347,6 @@ namespace NzbDrone.Core.Test.ParserTests
result.OriginalString.Should().Be(postTitle);
}
[TestCase("5.64 GB", 6055903887)]
[TestCase("5.54 GiB", 5948529705)]
[TestCase("398.62 MiB", 417983365)]
[TestCase("7,162.1MB", 7510006170)]
[TestCase("162.1MB", 169974170)]
[TestCase("398.62 MB", 417983365)]
public void parse_size(string sizeString, long expectedSize)
{
var result = Parser.GetReportSize(sizeString);
result.Should().Be(expectedSize);
}
[TestCase("Acropolis Now S05 EXTRAS DVDRip XviD RUNNER")]
[TestCase("Punky Brewster S01 EXTRAS DVDRip XviD RUNNER")]
[TestCase("Instant Star S03 EXTRAS DVDRip XviD OSiTV")]
@ -392,7 +380,7 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("[ 21154 ] - [ TrollHD ] - [ 00/73 ] - \"MythBusters S03E20 Escape Slide Parachute 1080i HDTV-UPSCALE DD5.1 MPEG2-TrollHD.nzb\" yEnc", "MythBusters S03E20 Escape Slide Parachute 1080i HDTV-UPSCALE DD5.1 MPEG2-TrollHD.nzb")]
public void parse_header(string title, string expected)
{
Parser.ParseHeader(title).Should().Be(expected);
BasicRssParser.ParseHeader(title).Should().Be(expected);
}
[TestCase("password - \"bdc435cb-93c4-4902-97ea-ca00568c3887.337\" yEnc")]

View File

@ -4,13 +4,14 @@ using System;
using System.Linq;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Model;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ParserTests
{
[TestFixture]
public class QualityParserFixture : CoreTest
{
public static object[] QualityParserCases =
@ -96,17 +97,17 @@ namespace NzbDrone.Core.Test.ParserTests
[Test, TestCaseSource("QualityParserCases")]
public void quality_parse(string postTitle, Quality quality, bool proper)
{
var result = Parser.ParseQuality(postTitle);
result.Quality.Should().Be(quality);
result.Proper.Should().Be(proper);
var result = Parser.ParseTitle<ParseResult>(postTitle);
result.Quality.Quality.Should().Be(quality);
result.Quality.Proper.Should().Be(proper);
}
[Test, TestCaseSource("SelfQualityParserCases")]
public void parsing_our_own_quality_enum(Quality quality)
{
var fileName = String.Format("My series S01E01 [{0}]", quality);
var result = Parser.ParseQuality(fileName);
result.Quality.Should().Be(quality);
var result = Parser.ParseTitle<ParseResult>(fileName);
result.Quality.Quality.Should().Be(quality);
}
}
}

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Core.Download;
using NzbDrone.Core.Model;
using NzbDrone.Core.Download.Clients.Nzbget;
using NzbDrone.Core.Download.Clients.Sabnzbd;

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NzbDrone.Core.Download;
using NzbDrone.Core.Model;
using NzbDrone.Core.Download.Clients.Nzbget;
using NzbDrone.Core.Download.Clients.Sabnzbd;

View File

@ -1,4 +1,4 @@
namespace NzbDrone.Core.Model
namespace NzbDrone.Core.Download.Clients
{
public class ConnectionInfoModel
{

View File

@ -1,4 +1,4 @@
namespace NzbDrone.Core.Model
namespace NzbDrone.Core.Download
{
public enum DownloadClientType
{

View File

@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.ServiceModel.Syndication;
using System.Text.RegularExpressions;
using NLog;
using NzbDrone.Core.Model;
@ -63,7 +65,7 @@ namespace NzbDrone.Core.Indexers
protected virtual string GetNzbInfoUrl(SyndicationItem item)
{
return string.Empty;
return String.Empty;
}
protected virtual IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
@ -89,7 +91,7 @@ namespace NzbDrone.Core.Indexers
return PostProcessor(item, episodeParseResult);
}
private static string ParseReleaseGroup(string title)
public static string ParseReleaseGroup(string title)
{
title = title.Trim();
var index = title.LastIndexOf('-');
@ -102,10 +104,59 @@ namespace NzbDrone.Core.Indexers
var group = title.Substring(index + 1);
if (group.Length == title.Length)
if (@group.Length == title.Length)
return String.Empty;
return group;
return @group;
}
private static readonly Regex[] HeaderRegex = new[]
{
new Regex(@"(?:\[.+\]\-\[.+\]\-\[.+\]\-\[)(?<nzbTitle>.+)(?:\]\-.+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
new Regex(@"(?:\[.+\]\W+\[.+\]\W+\[.+\]\W+\"")(?<nzbTitle>.+)(?:\"".+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
new Regex(@"(?:\[)(?<nzbTitle>.+)(?:\]\-.+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
};
public static string ParseHeader(string header)
{
foreach (var regex in HeaderRegex)
{
var match = regex.Matches(header);
if (match.Count != 0)
return match[0].Groups["nzbTitle"].Value.Trim();
}
return header;
}
private static readonly Regex ReportSizeRegex = new Regex(@"(?<value>\d+\.\d{1,2}|\d+\,\d+\.\d{1,2})\W?(?<unit>GB|MB|GiB|MiB)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static long GetReportSize(string sizeString)
{
var match = ReportSizeRegex.Matches(sizeString);
if (match.Count != 0)
{
var cultureInfo = new CultureInfo("en-US");
var value = Decimal.Parse(Regex.Replace(match[0].Groups["value"].Value, "\\,", ""), cultureInfo);
var unit = match[0].Groups["unit"].Value;
if (unit.Equals("MB", StringComparison.InvariantCultureIgnoreCase) || unit.Equals("MiB", StringComparison.InvariantCultureIgnoreCase))
return Convert.ToInt64(value * 1048576L);
if (unit.Equals("GB", StringComparison.InvariantCultureIgnoreCase) || unit.Equals("GiB", StringComparison.InvariantCultureIgnoreCase))
return Convert.ToInt64(value * 1073741824L);
}
return 0;
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace NzbDrone.Core.Indexers.Newznab
{
@ -20,39 +21,22 @@ namespace NzbDrone.Core.Indexers.Newznab
public override IEnumerable<string> GetEpisodeSearchUrls(string seriesTitle, int seasonNumber, int episodeNumber)
{
foreach (var url in RecentFeed)
{
yield return String.Format("{0}&limit=100&q={1}&season={2}&ep={3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeNumber);
}
return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}&ep={3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeNumber));
}
public override IEnumerable<string> GetDailyEpisodeSearchUrls(string seriesTitle, DateTime date)
{
var searchUrls = new List<string>();
foreach (var url in RecentFeed)
{
searchUrls.Add(String.Format("{0}&limit=100&q={1}&season={2:yyyy}&ep={2:MM/dd}", url, NewsnabifyTitle(seriesTitle), date));
}
return searchUrls;
return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2:yyyy}&ep={2:MM/dd}", url, NewsnabifyTitle(seriesTitle), date)).ToList();
}
public override IEnumerable<string> GetSeasonSearchUrls(string seriesTitle, int seasonNumber)
{
foreach (var url in RecentFeed)
{
yield return String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber);
}
return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber));
}
public override IEnumerable<string> GetPartialSeasonSearchUrls(string seriesTitle, int seasonNumber, int episodeWildcard)
{
foreach (var url in RecentFeed)
{
yield return
String.Format("{0}&limit=100&q={1}+S{2:00}E{3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeWildcard);
}
return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}+S{2:00}E{3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeWildcard));
}
public override string Name

View File

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Indexers.NzbClub
if (currentResult != null)
{
var sizeString = Regex.Match(item.Summary.Text, @"Size:\s\d+\.\d{1,2}\s\w{2}\s", RegexOptions.IgnoreCase | RegexOptions.Compiled).Value;
currentResult.Size = Parser.GetReportSize(sizeString);
currentResult.Size = GetReportSize(sizeString);
}
return currentResult;
@ -20,7 +20,7 @@ namespace NzbDrone.Core.Indexers.NzbClub
protected override string GetTitle(SyndicationItem syndicationItem)
{
var title = Parser.ParseHeader(syndicationItem.Title.Text);
var title = ParseHeader(syndicationItem.Title.Text);
if (String.IsNullOrWhiteSpace(title))
return syndicationItem.Title.Text;

View File

@ -23,18 +23,18 @@ namespace NzbDrone.Core.Indexers.NzbIndex
if (currentResult != null)
{
var sizeString = Regex.Match(item.Summary.Text, @"<b>\d+\.\d{1,2}\s\w{2}</b><br\s/>", RegexOptions.IgnoreCase | RegexOptions.Compiled).Value;
currentResult.Size = Parser.GetReportSize(sizeString);
currentResult.Size = GetReportSize(sizeString);
}
return currentResult;
}
protected override string GetTitle(SyndicationItem item)
protected override string GetTitle(SyndicationItem syndicationItem)
{
var title = Parser.ParseHeader(item.Title.Text);
var title = ParseHeader(syndicationItem.Title.Text);
if (String.IsNullOrWhiteSpace(title))
return item.Title.Text;
return syndicationItem.Title.Text;
return title;
}

View File

@ -11,7 +11,7 @@ namespace NzbDrone.Core.Indexers.NzbsRUs
if (currentResult != null)
{
var sizeString = Regex.Match(item.Summary.Text, @"\d+\.\d{1,2} \w{3}", RegexOptions.IgnoreCase).Value;
currentResult.Size = Parser.GetReportSize(sizeString);
currentResult.Size = GetReportSize(sizeString);
}
return currentResult;

View File

@ -4,7 +4,6 @@ using System.IO;
using NLog;
using Newtonsoft.Json;
using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Nzbx;
namespace NzbDrone.Core.Indexers.Nzbx
{

View File

@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model.Nzbx
namespace NzbDrone.Core.Indexers.Nzbx
{
public class NzbxRecentItem
{
@ -42,6 +39,5 @@ namespace NzbDrone.Core.Model.Nzbx
public int RageId { get; set; }
public int Comments { get; set; }
public int Downloads { get; set; }
public NzbxVotesModel Votes { get; set; }
}
}

View File

@ -31,7 +31,7 @@ namespace NzbDrone.Core.Indexers.Omgwtfnzbs
if (currentResult != null)
{
var sizeString = Regex.Match(item.Summary.Text, @"Size:\<\/b\>\s\d+\.\d{1,2}\s\w{2}\<br \/\>", RegexOptions.IgnoreCase | RegexOptions.Compiled).Value;
currentResult.Size = Parser.GetReportSize(sizeString);
currentResult.Size = GetReportSize(sizeString);
}
return currentResult;

View File

@ -72,7 +72,7 @@ namespace NzbDrone.Core.Indexers
return dateVal;
}
internal void CheckForError()
public void CheckForError()
{
if (this.MoveToContent() == XmlNodeType.Element)
{

View File

@ -1,47 +0,0 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace NzbDrone.Core.Model.Nzbx.JsonConverter
{
public class EpochDateTimeConverter : DateTimeConverterBase
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
long ticks;
if (value is DateTime)
{
var epoch = new DateTime(1970, 1, 1);
var delta = ((DateTime)value) - epoch;
if (delta.TotalSeconds < 0)
{
throw new ArgumentOutOfRangeException("value",
"Unix epoc starts January 1st, 1970");
}
ticks = (long)delta.TotalSeconds;
}
else
{
throw new Exception("Expected date object value.");
}
writer.WriteValue(ticks);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.Integer)
{
throw new Exception(
String.Format("Unexpected token parsing date. Expected Integer, got {0}.",
reader.TokenType));
}
var ticks = (long)reader.Value;
var date = new DateTime(1970, 1, 1);
date = date.AddSeconds(ticks);
return date;
}
}
}

View File

@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using NzbDrone.Core.Model.Nzbx.JsonConverter;
namespace NzbDrone.Core.Model.Nzbx
{
public class NzbxSearchItem
{
//"name": "30.Rock.S06E06E07.HDTV.XviD-LOL",
//"fromname": "teevee@4u.tv (teevee)",
//"size": 418067671,
//"groupid": 4,
//"categoryid": 5030,
//"totalpart": 36,
//"completion": 100,
//"rageid": "-1",
//"imdbid": "",
//"comments": "0",
//"guid": "97be14dbf1776eec4fb8f2bb835935c0",
//"adddate": 1355343562,
//"postdate": 1328839361,
//"downloads": "0",
//"votes": {
// "upvotes": 0,
// "downvotes": 0
//},
//"nzb": "https://nzbx.co/nzb?97be14dbf1776eec4fb8f2bb835935c0*|*30.Rock.S06E06E07.HDTV.XviD-LOL
public string Name { get; set; }
public int TotalPart { get; set; }
public int GroupId { get; set; }
public long Size { get; set; }
[JsonConverter(typeof(EpochDateTimeConverter))]
public DateTime AddDate { get; set; }
[JsonConverter(typeof(EpochDateTimeConverter))]
public DateTime PostDate { get; set; }
public string Guid { get; set; }
public string FromName { get; set; }
public int Completion { get; set; }
public int CategoryId { get; set; }
public string ImdbId { get; set; }
public int RageId { get; set; }
public int Comments { get; set; }
public int Downloads { get; set; }
public NzbxVotesModel Votes { get; set; }
public string Nzb { get; set; }
}
}

View File

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model.Nzbx
{
public class NzbxVotesModel
{
public int Up { get; set; }
public int Down { get; set; }
}
}

View File

@ -1,18 +0,0 @@
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Model
{
public class SeasonParseResult
{
internal string SeriesTitle { get; set; }
internal int SeasonNumber { get; set; }
internal int Year { get; set; }
public QualityModel Quality { get; set; }
public override string ToString()
{
return string.Format("Series:{0} Season:{1}", SeriesTitle, SeasonNumber);
}
}
}

View File

@ -1,35 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model
{
public class StatsModel
{
[DisplayName("Number of Series")]
public int SeriesTotal { get; set; }
[DisplayName("Number of Series Countinuing")]
public int SeriesContinuing { get; set; }
[DisplayName("Number of Series Ended")]
public int SeriesEnded { get; set; }
[DisplayName("Number of Episodes")]
public int EpisodesTotal { get; set; }
[DisplayName("Number of Episodes On Disk")]
public int EpisodesOnDisk { get; set; }
[DisplayName("Number of Episodes Missing")]
public int EpisodesMissing { get; set; }
[DisplayName("Downloaded in the Last Week")]
public int DownloadLastWeek { get; set; }
[DisplayName("Downloaded in the Last 30 days")]
public int DownloadedLastMonth { get; set; }
}
}

View File

@ -230,16 +230,17 @@
<Compile Include="DecisionEngine\Specifications\Search\SingleEpisodeMatchSpecification.cs" />
<Compile Include="DecisionEngine\Specifications\UpgradeDiskSpecification.cs" />
<Compile Include="DecisionEngine\Specifications\UpgradeHistorySpecification.cs" />
<Compile Include="Download\Clients\ConnectionInfoModel.cs" />
<Compile Include="Download\Clients\Sabnzbd\JsonConverters\SabnzbdPriorityTypeConverter.cs" />
<Compile Include="Download\Clients\Sabnzbd\JsonConverters\SabnzbdQueueTimeConverter.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabAutoConfigureService.cs" />
<Compile Include="Download\DownloadClientProvider.cs" />
<Compile Include="Download\DownloadClientType.cs" />
<Compile Include="MediaFiles\Events\EpisodeDownloadedEvent.cs" />
<Compile Include="Download\EpisodeGrabbedEvent.cs" />
<Compile Include="Download\SeriesRenamedEvent.cs" />
<Compile Include="ExternalNotification\ExternalNotificationRepository.cs" />
<Compile Include="Fluent.cs" />
<Compile Include="Model\Nzbx\JsonConverter\EpochDateTimeConverter.cs" />
<Compile Include="Helpers\SortHelper.cs" />
<Compile Include="History\HistoryRepository.cs" />
<Compile Include="IndexerSearch\Definitions\DailyEpisodeSearchDefinition.cs" />
@ -321,11 +322,9 @@
<Compile Include="MetadataSource\Trakt\TopWatcher.cs" />
<Compile Include="Organizer\EpisodeSortingType.cs" />
<Compile Include="Organizer\FileNameBuilder.cs" />
<Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Instrumentation\LogService.cs" />
<Compile Include="Instrumentation\DatabaseTarget.cs" />
<Compile Include="Model\AtomicParsleyTitleType.cs" />
<Compile Include="Model\ConnectionInfoModel.cs" />
<Compile Include="Model\BacklogSettingType.cs" />
<Compile Include="Model\MediaInfoModel.cs" />
<Compile Include="Download\Clients\Nzbget\EnqueueResponse.cs" />
@ -336,9 +335,7 @@
<Compile Include="Download\Clients\Nzbget\QueueItem.cs" />
<Compile Include="Download\Clients\Nzbget\PriorityType.cs" />
<Compile Include="Download\Clients\Nzbget\VersionModel.cs" />
<Compile Include="Model\Nzbx\NzbxSearchItem.cs" />
<Compile Include="Model\Nzbx\NzbxRecentItem.cs" />
<Compile Include="Model\Nzbx\NzbxVotesModel.cs" />
<Compile Include="Indexers\Nzbx\NzbxRecentItem.cs" />
<Compile Include="Model\PostDownloadStatusType.cs" />
<Compile Include="Model\LanguageType.cs" />
<Compile Include="Model\MisnamedEpisodeModel.cs" />
@ -363,7 +360,6 @@
<Compile Include="Download\Clients\Sabnzbd\SabModel.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabQueueItem.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabVersionModel.cs" />
<Compile Include="Model\StatsModel.cs" />
<Compile Include="Model\Twitter\TwitterAuthorizationModel.cs" />
<Compile Include="Model\UpdatePackage.cs" />
<Compile Include="Model\Xbmc\ActionType.cs" />
@ -512,7 +508,6 @@
<Compile Include="Model\IndexerParseResult.cs" />
<Compile Include="Model\EpisodeStatusType.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabPriorityType.cs" />
<Compile Include="Model\SeasonParseResult.cs" />
<Compile Include="MediaFiles\EpisodeFile.cs" />
<Compile Include="Model\Notification\ProgressNotificationStatus.cs" />
<Compile Include="Parser.cs" />

View File

@ -53,7 +53,7 @@ namespace NzbDrone.Core
new Regex(@"^(?<title>.+?)?(?:\W?(?<season>(?<!\d+)\d{1})(?<episode>\d{2}(?!p|i|\d+)))+\W?(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
//Mini-Series, treated as season 1, episodes are labeled as Part01, Part 01, Part.1
//Mini-Series, treated as season 1, episodes are labelled as Part01, Part 01, Part.1
new Regex(@"^(?<title>.+?)(?:\W+(?:(?:Part\W?|(?<!\d+\W+)e)(?<episode>\d{1,2}(?!\d+)))+)\W?(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
@ -72,26 +72,13 @@ namespace NzbDrone.Core
private static readonly Regex SimpleTitleRegex = new Regex(@"480[i|p]|720[i|p]|1080[i|p]|[x|h|x\s|h\s]264|DD\W?5\W1|\<|\>|\?|\*|\:|\||""",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex ReportSizeRegex = new Regex(@"(?<value>\d+\.\d{1,2}|\d+\,\d+\.\d{1,2})\W?(?<unit>GB|MB|GiB|MiB)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex[] HeaderRegex = new[]
{
new Regex(@"(?:\[.+\]\-\[.+\]\-\[.+\]\-\[)(?<nzbTitle>.+)(?:\]\-.+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
new Regex(@"(?:\[.+\]\W+\[.+\]\W+\[.+\]\W+\"")(?<nzbTitle>.+)(?:\"".+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
new Regex(@"(?:\[)(?<nzbTitle>.+)(?:\]\-.+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
};
private static readonly Regex MultiPartCleanupRegex = new Regex(@"\(\d+\)$", RegexOptions.Compiled);
private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_)(?<italian>ita|italian)|(?<german>german\b)|(?<flemish>flemish)|(?<greek>greek)(?:\W|_)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
internal static FileNameParseResult ParsePath(string path)
public static FileNameParseResult ParsePath(string path)
{
var fileInfo = new FileInfo(path);
@ -115,7 +102,7 @@ namespace NzbDrone.Core
return result;
}
internal static T ParseTitle<T>(string title) where T : ParseResult, new()
public static T ParseTitle<T>(string title) where T : ParseResult, new()
{
try
{
@ -158,12 +145,12 @@ namespace NzbDrone.Core
{
var seriesName = matchCollection[0].Groups["title"].Value.Replace('.', ' ');
int airyear;
Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out airyear);
int airYear;
Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out airYear);
T parsedIndexer;
T result;
if (airyear < 1900)
if (airYear < 1900)
{
var seasons = new List<int>();
@ -182,7 +169,7 @@ namespace NzbDrone.Core
if (seasons.Distinct().Count() > 1)
return null;
parsedIndexer = new T
result = new T
{
SeasonNumber = seasons.First(),
EpisodeNumbers = new List<int>()
@ -197,7 +184,7 @@ namespace NzbDrone.Core
{
var first = Convert.ToInt32(episodeCaptures.First().Value);
var last = Convert.ToInt32(episodeCaptures.Last().Value);
parsedIndexer.EpisodeNumbers = Enumerable.Range(first, last - first + 1).ToList();
result.EpisodeNumbers = Enumerable.Range(first, last - first + 1).ToList();
}
else
{
@ -206,7 +193,7 @@ namespace NzbDrone.Core
if (!String.IsNullOrWhiteSpace(matchCollection[0].Groups["extras"].Value))
return null;
parsedIndexer.FullSeason = true;
result.FullSeason = true;
}
}
}
@ -225,17 +212,17 @@ namespace NzbDrone.Core
airmonth = tempDay;
}
parsedIndexer = new T
result = new T
{
AirDate = new DateTime(airyear, airmonth, airday).Date,
AirDate = new DateTime(airYear, airmonth, airday).Date,
};
}
parsedIndexer.SeriesTitle = seriesName;
result.SeriesTitle = seriesName;
Logger.Trace("Episode Parsed. {0}", parsedIndexer);
Logger.Trace("Episode Parsed. {0}", result);
return parsedIndexer;
return result;
}
public static string ParseSeriesName(string title)
@ -250,7 +237,7 @@ namespace NzbDrone.Core
return parseResult.CleanTitle;
}
internal static QualityModel ParseQuality(string name)
private static QualityModel ParseQuality(string name)
{
Logger.Trace("Trying to parse quality for {0}", name);
@ -399,7 +386,7 @@ namespace NzbDrone.Core
return result;
}
internal static LanguageType ParseLanguage(string title)
private static LanguageType ParseLanguage(string title)
{
var lowerTitle = title.ToLower();
@ -484,40 +471,7 @@ namespace NzbDrone.Core
return NormalizeRegex.Replace(title, String.Empty).ToLower();
}
public static long GetReportSize(string sizeString)
{
var match = ReportSizeRegex.Matches(sizeString);
if (match.Count != 0)
{
var cultureInfo = new CultureInfo("en-US");
var value = Decimal.Parse(Regex.Replace(match[0].Groups["value"].Value, "\\,", ""), cultureInfo);
var unit = match[0].Groups["unit"].Value;
if (unit.Equals("MB", StringComparison.InvariantCultureIgnoreCase) || unit.Equals("MiB", StringComparison.InvariantCultureIgnoreCase))
return Convert.ToInt64(value * 1048576L);
if (unit.Equals("GB", StringComparison.InvariantCultureIgnoreCase) || unit.Equals("GiB", StringComparison.InvariantCultureIgnoreCase))
return Convert.ToInt64(value * 1073741824L);
}
return 0;
}
internal static string ParseHeader(string header)
{
foreach (var regex in HeaderRegex)
{
var match = regex.Matches(header);
if (match.Count != 0)
return match[0].Groups["nzbTitle"].Value.Trim();
}
return header;
}
internal static string CleanupEpisodeTitle(string title)
public static string CleanupEpisodeTitle(string title)
{
//this will remove (1),(2) from the end of multi part episodes.
return MultiPartCleanupRegex.Replace(title, string.Empty).Trim();

View File

@ -18,8 +18,8 @@ namespace NzbDrone.Test.Common.AutoMoq
[DebuggerStepThrough]
public class AutoMoqer
{
internal readonly MockBehavior DefaultBehavior = MockBehavior.Default;
internal Type ResolveType;
public readonly MockBehavior DefaultBehavior = MockBehavior.Default;
public Type ResolveType;
private IUnityContainer container;
private IDictionary<Type, object> registeredMocks;
@ -35,7 +35,7 @@ namespace NzbDrone.Test.Common.AutoMoq
}
internal AutoMoqer(IUnityContainer container)
public AutoMoqer(IUnityContainer container)
{
SetupAutoMoqer(container);
}
@ -73,7 +73,7 @@ namespace NzbDrone.Test.Common.AutoMoq
return mock;
}
internal virtual void SetMock(Type type, Mock mock)
public virtual void SetMock(Type type, Mock mock)
{
if (registeredMocks.ContainsKey(type) == false)
registeredMocks.Add(type, mock);

View File

@ -10,7 +10,7 @@ using Moq;
namespace NzbDrone.Test.Common.AutoMoq.Unity
{
internal class AutoMockingBuilderStrategy : BuilderStrategy
public class AutoMockingBuilderStrategy : BuilderStrategy
{
private readonly IUnityContainer _container;
private readonly MockRepository _mockFactory;

View File

@ -8,7 +8,7 @@ using Microsoft.Practices.Unity.ObjectBuilder;
namespace NzbDrone.Test.Common.AutoMoq.Unity
{
internal class AutoMockingContainerExtension : UnityContainerExtension
public class AutoMockingContainerExtension : UnityContainerExtension
{
private readonly IList<Type> registeredTypes = new List<Type>();

View File

@ -7,7 +7,7 @@ using System.Security.Principal;
namespace ServiceInstall
{
internal static class ServiceHelper
public static class ServiceHelper
{
private static string NzbDroneExe
{
@ -23,7 +23,7 @@ namespace ServiceInstall
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
internal static void Run(string arg)
public static void Run(string arg)
{
if (!File.Exists(NzbDroneExe))
{

View File

@ -7,7 +7,7 @@ using System.Security.Principal;
namespace ServiceUninstall
{
internal static class ServiceHelper
public static class ServiceHelper
{
private static string NzbDroneExe
{
@ -23,7 +23,7 @@ namespace ServiceUninstall
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
internal static void Run(string arg)
public static void Run(string arg)
{
if (!File.Exists(NzbDroneExe))
{