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\DbTest.cs" />
<Compile Include="Framework\NBuilderExtensions.cs" /> <Compile Include="Framework\NBuilderExtensions.cs" />
<Compile Include="IndexerSearchTests\SearchDefinitionFixture.cs" /> <Compile Include="IndexerSearchTests\SearchDefinitionFixture.cs" />
<Compile Include="IndexerTests\BasicRssParserFixture.cs" />
<Compile Include="JobTests\JobRepositoryFixture.cs" /> <Compile Include="JobTests\JobRepositoryFixture.cs" />
<Compile Include="JobTests\RenameSeasonJobFixture.cs" /> <Compile Include="JobTests\RenameSeasonJobFixture.cs" />
<Compile Include="DecisionEngineTests\LanguageSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\LanguageSpecificationFixture.cs" />

View File

@ -4,6 +4,7 @@ using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Contract; using NzbDrone.Common.Contract;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common; 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)] [TestCase("Burn.Notice.S04E15.Brotherly.Love.GERMAN.DUBBED.WS.WEBRiP.XviD.REPACK-TVP", LanguageType.German)]
public void parse_language(string postTitle, LanguageType language) public void parse_language(string postTitle, LanguageType language)
{ {
var result = Parser.ParseLanguage(postTitle); var result = Parser.ParseTitle<ParseResult>(postTitle);
result.Should().Be(language); result.Language.Should().Be(language);
} }
[TestCase("Hawaii Five 0 S01 720p WEB DL DD5 1 H 264 NT", "Hawaii Five", 1)] [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); 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("Acropolis Now S05 EXTRAS DVDRip XviD RUNNER")]
[TestCase("Punky Brewster S01 EXTRAS DVDRip XviD RUNNER")] [TestCase("Punky Brewster S01 EXTRAS DVDRip XviD RUNNER")]
[TestCase("Instant Star S03 EXTRAS DVDRip XviD OSiTV")] [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")] [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) 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")] [TestCase("password - \"bdc435cb-93c4-4902-97ea-ca00568c3887.337\" yEnc")]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.ServiceModel.Syndication; using System.ServiceModel.Syndication;
using System.Text.RegularExpressions;
using NLog; using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -63,7 +65,7 @@ namespace NzbDrone.Core.Indexers
protected virtual string GetNzbInfoUrl(SyndicationItem item) protected virtual string GetNzbInfoUrl(SyndicationItem item)
{ {
return string.Empty; return String.Empty;
} }
protected virtual IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult) protected virtual IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
@ -89,7 +91,7 @@ namespace NzbDrone.Core.Indexers
return PostProcessor(item, episodeParseResult); return PostProcessor(item, episodeParseResult);
} }
private static string ParseReleaseGroup(string title) public static string ParseReleaseGroup(string title)
{ {
title = title.Trim(); title = title.Trim();
var index = title.LastIndexOf('-'); var index = title.LastIndexOf('-');
@ -102,10 +104,59 @@ namespace NzbDrone.Core.Indexers
var group = title.Substring(index + 1); var group = title.Substring(index + 1);
if (group.Length == title.Length) if (@group.Length == title.Length)
return String.Empty; 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace NzbDrone.Core.Indexers.Newznab 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) public override IEnumerable<string> GetEpisodeSearchUrls(string seriesTitle, int seasonNumber, int episodeNumber)
{ {
foreach (var url in RecentFeed) return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}&ep={3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeNumber));
{
yield return 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) public override IEnumerable<string> GetDailyEpisodeSearchUrls(string seriesTitle, DateTime date)
{ {
var searchUrls = new List<string>(); return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2:yyyy}&ep={2:MM/dd}", url, NewsnabifyTitle(seriesTitle), date)).ToList();
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;
} }
public override IEnumerable<string> GetSeasonSearchUrls(string seriesTitle, int seasonNumber) public override IEnumerable<string> GetSeasonSearchUrls(string seriesTitle, int seasonNumber)
{ {
foreach (var url in RecentFeed) return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber));
{
yield return String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber);
}
} }
public override IEnumerable<string> GetPartialSeasonSearchUrls(string seriesTitle, int seasonNumber, int episodeWildcard) public override IEnumerable<string> GetPartialSeasonSearchUrls(string seriesTitle, int seasonNumber, int episodeWildcard)
{ {
foreach (var url in RecentFeed) return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}+S{2:00}E{3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeWildcard));
{
yield return
String.Format("{0}&limit=100&q={1}+S{2:00}E{3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeWildcard);
}
} }
public override string Name public override string Name

View File

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Indexers.NzbClub
if (currentResult != null) 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; 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; return currentResult;
@ -20,7 +20,7 @@ namespace NzbDrone.Core.Indexers.NzbClub
protected override string GetTitle(SyndicationItem syndicationItem) protected override string GetTitle(SyndicationItem syndicationItem)
{ {
var title = Parser.ParseHeader(syndicationItem.Title.Text); var title = ParseHeader(syndicationItem.Title.Text);
if (String.IsNullOrWhiteSpace(title)) if (String.IsNullOrWhiteSpace(title))
return syndicationItem.Title.Text; return syndicationItem.Title.Text;

View File

@ -23,18 +23,18 @@ namespace NzbDrone.Core.Indexers.NzbIndex
if (currentResult != null) 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; 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; 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)) if (String.IsNullOrWhiteSpace(title))
return item.Title.Text; return syndicationItem.Title.Text;
return title; return title;
} }

View File

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

View File

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

View File

@ -1,9 +1,6 @@
using System; 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 public class NzbxRecentItem
{ {
@ -42,6 +39,5 @@ namespace NzbDrone.Core.Model.Nzbx
public int RageId { get; set; } public int RageId { get; set; }
public int Comments { get; set; } public int Comments { get; set; }
public int Downloads { 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) 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; 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; return currentResult;

View File

@ -72,7 +72,7 @@ namespace NzbDrone.Core.Indexers
return dateVal; return dateVal;
} }
internal void CheckForError() public void CheckForError()
{ {
if (this.MoveToContent() == XmlNodeType.Element) 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\Search\SingleEpisodeMatchSpecification.cs" />
<Compile Include="DecisionEngine\Specifications\UpgradeDiskSpecification.cs" /> <Compile Include="DecisionEngine\Specifications\UpgradeDiskSpecification.cs" />
<Compile Include="DecisionEngine\Specifications\UpgradeHistorySpecification.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\SabnzbdPriorityTypeConverter.cs" />
<Compile Include="Download\Clients\Sabnzbd\JsonConverters\SabnzbdQueueTimeConverter.cs" /> <Compile Include="Download\Clients\Sabnzbd\JsonConverters\SabnzbdQueueTimeConverter.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabAutoConfigureService.cs" /> <Compile Include="Download\Clients\Sabnzbd\SabAutoConfigureService.cs" />
<Compile Include="Download\DownloadClientProvider.cs" /> <Compile Include="Download\DownloadClientProvider.cs" />
<Compile Include="Download\DownloadClientType.cs" />
<Compile Include="MediaFiles\Events\EpisodeDownloadedEvent.cs" /> <Compile Include="MediaFiles\Events\EpisodeDownloadedEvent.cs" />
<Compile Include="Download\EpisodeGrabbedEvent.cs" /> <Compile Include="Download\EpisodeGrabbedEvent.cs" />
<Compile Include="Download\SeriesRenamedEvent.cs" /> <Compile Include="Download\SeriesRenamedEvent.cs" />
<Compile Include="ExternalNotification\ExternalNotificationRepository.cs" /> <Compile Include="ExternalNotification\ExternalNotificationRepository.cs" />
<Compile Include="Fluent.cs" /> <Compile Include="Fluent.cs" />
<Compile Include="Model\Nzbx\JsonConverter\EpochDateTimeConverter.cs" />
<Compile Include="Helpers\SortHelper.cs" /> <Compile Include="Helpers\SortHelper.cs" />
<Compile Include="History\HistoryRepository.cs" /> <Compile Include="History\HistoryRepository.cs" />
<Compile Include="IndexerSearch\Definitions\DailyEpisodeSearchDefinition.cs" /> <Compile Include="IndexerSearch\Definitions\DailyEpisodeSearchDefinition.cs" />
@ -321,11 +322,9 @@
<Compile Include="MetadataSource\Trakt\TopWatcher.cs" /> <Compile Include="MetadataSource\Trakt\TopWatcher.cs" />
<Compile Include="Organizer\EpisodeSortingType.cs" /> <Compile Include="Organizer\EpisodeSortingType.cs" />
<Compile Include="Organizer\FileNameBuilder.cs" /> <Compile Include="Organizer\FileNameBuilder.cs" />
<Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Instrumentation\LogService.cs" /> <Compile Include="Instrumentation\LogService.cs" />
<Compile Include="Instrumentation\DatabaseTarget.cs" /> <Compile Include="Instrumentation\DatabaseTarget.cs" />
<Compile Include="Model\AtomicParsleyTitleType.cs" /> <Compile Include="Model\AtomicParsleyTitleType.cs" />
<Compile Include="Model\ConnectionInfoModel.cs" />
<Compile Include="Model\BacklogSettingType.cs" /> <Compile Include="Model\BacklogSettingType.cs" />
<Compile Include="Model\MediaInfoModel.cs" /> <Compile Include="Model\MediaInfoModel.cs" />
<Compile Include="Download\Clients\Nzbget\EnqueueResponse.cs" /> <Compile Include="Download\Clients\Nzbget\EnqueueResponse.cs" />
@ -336,9 +335,7 @@
<Compile Include="Download\Clients\Nzbget\QueueItem.cs" /> <Compile Include="Download\Clients\Nzbget\QueueItem.cs" />
<Compile Include="Download\Clients\Nzbget\PriorityType.cs" /> <Compile Include="Download\Clients\Nzbget\PriorityType.cs" />
<Compile Include="Download\Clients\Nzbget\VersionModel.cs" /> <Compile Include="Download\Clients\Nzbget\VersionModel.cs" />
<Compile Include="Model\Nzbx\NzbxSearchItem.cs" /> <Compile Include="Indexers\Nzbx\NzbxRecentItem.cs" />
<Compile Include="Model\Nzbx\NzbxRecentItem.cs" />
<Compile Include="Model\Nzbx\NzbxVotesModel.cs" />
<Compile Include="Model\PostDownloadStatusType.cs" /> <Compile Include="Model\PostDownloadStatusType.cs" />
<Compile Include="Model\LanguageType.cs" /> <Compile Include="Model\LanguageType.cs" />
<Compile Include="Model\MisnamedEpisodeModel.cs" /> <Compile Include="Model\MisnamedEpisodeModel.cs" />
@ -363,7 +360,6 @@
<Compile Include="Download\Clients\Sabnzbd\SabModel.cs" /> <Compile Include="Download\Clients\Sabnzbd\SabModel.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabQueueItem.cs" /> <Compile Include="Download\Clients\Sabnzbd\SabQueueItem.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabVersionModel.cs" /> <Compile Include="Download\Clients\Sabnzbd\SabVersionModel.cs" />
<Compile Include="Model\StatsModel.cs" />
<Compile Include="Model\Twitter\TwitterAuthorizationModel.cs" /> <Compile Include="Model\Twitter\TwitterAuthorizationModel.cs" />
<Compile Include="Model\UpdatePackage.cs" /> <Compile Include="Model\UpdatePackage.cs" />
<Compile Include="Model\Xbmc\ActionType.cs" /> <Compile Include="Model\Xbmc\ActionType.cs" />
@ -512,7 +508,6 @@
<Compile Include="Model\IndexerParseResult.cs" /> <Compile Include="Model\IndexerParseResult.cs" />
<Compile Include="Model\EpisodeStatusType.cs" /> <Compile Include="Model\EpisodeStatusType.cs" />
<Compile Include="Download\Clients\Sabnzbd\SabPriorityType.cs" /> <Compile Include="Download\Clients\Sabnzbd\SabPriorityType.cs" />
<Compile Include="Model\SeasonParseResult.cs" />
<Compile Include="MediaFiles\EpisodeFile.cs" /> <Compile Include="MediaFiles\EpisodeFile.cs" />
<Compile Include="Model\Notification\ProgressNotificationStatus.cs" /> <Compile Include="Model\Notification\ProgressNotificationStatus.cs" />
<Compile Include="Parser.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?(?!\\)", new Regex(@"^(?<title>.+?)?(?:\W?(?<season>(?<!\d+)\d{1})(?<episode>\d{2}(?!p|i|\d+)))+\W?(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled), 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?(?!\\)", new Regex(@"^(?<title>.+?)(?:\W+(?:(?:Part\W?|(?<!\d+\W+)e)(?<episode>\d{1,2}(?!\d+)))+)\W?(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled), 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|\<|\>|\?|\*|\:|\||""", 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); 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 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); 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); var fileInfo = new FileInfo(path);
@ -115,7 +102,7 @@ namespace NzbDrone.Core
return result; 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 try
{ {
@ -158,12 +145,12 @@ namespace NzbDrone.Core
{ {
var seriesName = matchCollection[0].Groups["title"].Value.Replace('.', ' '); var seriesName = matchCollection[0].Groups["title"].Value.Replace('.', ' ');
int airyear; int airYear;
Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out 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>(); var seasons = new List<int>();
@ -182,7 +169,7 @@ namespace NzbDrone.Core
if (seasons.Distinct().Count() > 1) if (seasons.Distinct().Count() > 1)
return null; return null;
parsedIndexer = new T result = new T
{ {
SeasonNumber = seasons.First(), SeasonNumber = seasons.First(),
EpisodeNumbers = new List<int>() EpisodeNumbers = new List<int>()
@ -197,7 +184,7 @@ namespace NzbDrone.Core
{ {
var first = Convert.ToInt32(episodeCaptures.First().Value); var first = Convert.ToInt32(episodeCaptures.First().Value);
var last = Convert.ToInt32(episodeCaptures.Last().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 else
{ {
@ -206,7 +193,7 @@ namespace NzbDrone.Core
if (!String.IsNullOrWhiteSpace(matchCollection[0].Groups["extras"].Value)) if (!String.IsNullOrWhiteSpace(matchCollection[0].Groups["extras"].Value))
return null; return null;
parsedIndexer.FullSeason = true; result.FullSeason = true;
} }
} }
} }
@ -225,17 +212,17 @@ namespace NzbDrone.Core
airmonth = tempDay; 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) public static string ParseSeriesName(string title)
@ -250,7 +237,7 @@ namespace NzbDrone.Core
return parseResult.CleanTitle; return parseResult.CleanTitle;
} }
internal static QualityModel ParseQuality(string name) private static QualityModel ParseQuality(string name)
{ {
Logger.Trace("Trying to parse quality for {0}", name); Logger.Trace("Trying to parse quality for {0}", name);
@ -399,7 +386,7 @@ namespace NzbDrone.Core
return result; return result;
} }
internal static LanguageType ParseLanguage(string title) private static LanguageType ParseLanguage(string title)
{ {
var lowerTitle = title.ToLower(); var lowerTitle = title.ToLower();
@ -484,40 +471,7 @@ namespace NzbDrone.Core
return NormalizeRegex.Replace(title, String.Empty).ToLower(); return NormalizeRegex.Replace(title, String.Empty).ToLower();
} }
public static long GetReportSize(string sizeString) public static string CleanupEpisodeTitle(string title)
{
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)
{ {
//this will remove (1),(2) from the end of multi part episodes. //this will remove (1),(2) from the end of multi part episodes.
return MultiPartCleanupRegex.Replace(title, string.Empty).Trim(); return MultiPartCleanupRegex.Replace(title, string.Empty).Trim();

View File

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

View File

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

View File

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

View File

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

View File

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