diff --git a/NzbDrone.Core.Test/Files/Queue.xml b/NzbDrone.Core.Test/Files/Queue.xml index 82afab54f..33e7622ce 100644 --- a/NzbDrone.Core.Test/Files/Queue.xml +++ b/NzbDrone.Core.Test/Files/Queue.xml @@ -1,115 +1,120 @@ -us-en -5c770e3197e4fe763423ee7c392c25d1 -Queued -0 -unknown -0:00:00 -11h - + + us-en + 5c770e3197e4fe763423ee7c392c25d1 + + + Queued + 0 + unknown + 0:00:00 + 11h + - - -770.96 -770.96 MB -Ubuntu Test -Normal -None -770.96 -0 -SABnzbd_nzo_xyr5ak + + + 770.96 + 770.96 MB + Ubuntu Test + Normal + None + 770.96 + 0 + SABnzbd_nzo_xyr5ak -3 -770.96 MB - - -0 -770.96 MB -0 -0 -259.45 -False + 3 + 770.96 MB + + + 0 + 770.96 MB + 0 + 0 + 259.45 + False - -0 -1 -0 -None -anime -apps -books -consoles + + 0 + 1 + 0 + + None + anime + apps + books + consoles -ds-games -emulation -games -misc -movies -music -pda -resources -test + ds-games + emulation + games + misc + movies + music + pda + resources + test -tv -tv-dvd -unknown -wii-games -xbox-dlc -xbox-xbla - -259.45 -770.96 + tv + tv-dvd + unknown + wii-games + xbox-dlc + xbox-xbla + + 259.45 + 770.96 - -157286400 - -C:\Program Files\SABnzbd\interfaces\Plush\templates -True -False -False -True -http://wiki.sabnzbd.org/ -4d + + 157286400 + + C:\Program Files\SABnzbd\interfaces\Plush\templates + True + False + False + True + http://wiki.sabnzbd.org/ + 4d - -0.6.x - - -True -Paused -0 -0 -False - -770.96 MB + + 0.6.x + + + True + Paused + 0 + 0 + False + + 770.96 MB -0B -770.96 -1177.64 -1177.64 - - - - - + 0B + 770.96 + 1177.64 + 1177.64 + + + + + + - - - - - - - - - + + + + + + + + + - - - -0:00:00 - -unknown -0.00 - -0 + + + + 0:00:00 + + unknown + 0.00 + + 0 \ No newline at end of file diff --git a/NzbDrone.Core.Test/SabControllerTest.cs b/NzbDrone.Core.Test/SabControllerTest.cs index 6727e01ce..c86f59689 100644 --- a/NzbDrone.Core.Test/SabControllerTest.cs +++ b/NzbDrone.Core.Test/SabControllerTest.cs @@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test config.Setup(c => c.GetValue("Priority", String.Empty, false)).Returns(priority); var http = new Mock(); - http.Setup(s => s.GetRequest("http://192.168.5.55:2222/sabnzbd/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("ok"); + http.Setup(s => s.DownloadString("http://192.168.5.55:2222/sabnzbd/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("ok"); var target = new SabProvider(config.Object, new Mock().Object, http.Object); @@ -67,7 +67,7 @@ namespace NzbDrone.Core.Test config.Setup(c => c.GetValue("Priority", String.Empty, false)).Returns(priority); var http = new Mock(); - http.Setup(s => s.GetRequest("http://192.168.5.55:2222/sabnzbd/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("error"); + http.Setup(s => s.DownloadString("http://192.168.5.55:2222/sabnzbd/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("error"); var target = new SabProvider(config.Object, new Mock().Object, http.Object); @@ -102,16 +102,15 @@ namespace NzbDrone.Core.Test var http = new Mock(); http.Setup( s => - s.GetRequest( + s.DownloadString( "http://192.168.5.55:2222/sabnzbd/api?mode=queue&output=xml&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Returns(new StreamReader(@".\Files\Queue.xml").ReadToEnd()); var target = new SabProvider(config.Object, new Mock().Object, http.Object); Episode episode = new Episode(); - FeedItem item = new FeedItem(); - item.TitleFix = "Ubuntu Test"; - episode.FeedItem = item; + + episode.FileName = "Ubuntu Test"; //Act bool result = target.IsInQueue(episode); @@ -140,16 +139,13 @@ namespace NzbDrone.Core.Test var http = new Mock(); http.Setup( s => - s.GetRequest( + s.DownloadString( "http://192.168.5.55:2222/sabnzbd/api?mode=queue&output=xml&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Returns(new StreamReader(@".\Files\QueueEmpty.xml").ReadToEnd()); var target = new SabProvider(config.Object, new Mock().Object, http.Object); Episode episode = new Episode(); - FeedItem item = new FeedItem(); - item.TitleFix = "Ubuntu Test"; - episode.FeedItem = item; //Act bool result = target.IsInQueue(episode); @@ -178,7 +174,7 @@ namespace NzbDrone.Core.Test var http = new Mock(); http.Setup( s => - s.GetRequest( + s.DownloadString( "http://192.168.5.55:2222/sabnzbd/api?mode=queue&output=xml&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Returns(new StreamReader(@".\Files\QueueError.xml").ReadToEnd()); @@ -187,7 +183,6 @@ namespace NzbDrone.Core.Test Episode episode = new Episode(); FeedItem item = new FeedItem(); item.TitleFix = "Ubuntu Test"; - episode.FeedItem = item; //Act bool result = target.IsInQueue(episode); diff --git a/NzbDrone.Core/Helpers/Disk.cs b/NzbDrone.Core/Helpers/Disk.cs deleted file mode 100644 index 4c56b58a6..000000000 --- a/NzbDrone.Core/Helpers/Disk.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NzbDrone.Core.Helpers -{ - - static class Disk - { - - /// - /// Cleans the path. making it a uniform path. - /// this will normalize all different presentations of a single folder. - /// - /// The path. - /// Cleaned Path - public static string CleanPath(string path) - { - if (string.IsNullOrEmpty(path)) throw new ArgumentException("Path can not be null or empty"); - return path.ToLower().Trim('/', '\\', ' '); - } - - } -} diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 4e0f4a0e4..34808b3c3 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -136,17 +136,18 @@ + - + diff --git a/NzbDrone.Core/Providers/DiskProvider.cs b/NzbDrone.Core/Providers/DiskProvider.cs index 3773585ab..785cb78ae 100644 --- a/NzbDrone.Core/Providers/DiskProvider.cs +++ b/NzbDrone.Core/Providers/DiskProvider.cs @@ -23,5 +23,11 @@ namespace NzbDrone.Core.Providers } #endregion + + public static string CleanPath(string path) + { + if (string.IsNullOrEmpty(path)) throw new ArgumentException("Path can not be null or empty"); + return path.ToLower().Trim('/', '\\', ' '); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs new file mode 100644 index 000000000..5f3a8bc66 --- /dev/null +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -0,0 +1,68 @@ +using System; +using System.Text.RegularExpressions; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers +{ + public class EpisodeProvider + { + private static Regex _parseRegex = + new Regex( + @"(?.*) +(?: + s(?\d+)e(?\d+)-?e(?\d+) +| s(?\d+)e(?\d+) +| (?\d+)x(?\d+) +| (?\d{4}.\d{2}.\d{2}) +) +(?: + (?.*?) + (? + (?:hdtv|pdtv|xvid|ws|720p|x264|bdrip|dvdrip|dsr|proper) + .*) +| (?.*) +)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); + + + public static Episode Parse(string title) + { + Match match = _parseRegex.Match(title); + + if (!match.Success) + return null; + + return new Episode + { + + Season = ParseInt(match.Groups["seasonNumber"].Value), + EpisodeNumber = ParseInt(match.Groups["episodeNumber"].Value), + EpisodeNumber2 = ParseInt(match.Groups["episodeNumber2"].Value), + Title = ReplaceSeparatorChars(match.Groups["episodeName"].Value), + Release = ReplaceSeparatorChars(match.Groups["release"].Value), + Proper = title.Contains("PROPER") + }; + } + + private static string ReplaceSeparatorChars(string s) + { + if (s == null) return string.Empty; + return s.Replace('.', ' ').Replace('-', ' ').Replace('_', ' ').Trim(); + } + + private static int ParseInt(string s) + { + int i; + int.TryParse(s, out i); + return i; + } + + private static DateTime ParseAirDate(string s) + { + DateTime d; + if (DateTime.TryParse(ReplaceSeparatorChars(s).Replace(' ', '-'), out d)) + return d; + return DateTime.MinValue; + } + + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/HttpProvider.cs b/NzbDrone.Core/Providers/HttpProvider.cs index a01156f21..acd2a2d57 100644 --- a/NzbDrone.Core/Providers/HttpProvider.cs +++ b/NzbDrone.Core/Providers/HttpProvider.cs @@ -5,19 +5,9 @@ namespace NzbDrone.Core.Providers { class HttpProvider : IHttpProvider { - public string GetRequest(string request) + public string DownloadString(string request) { - //Get the request and return as String Array - try - { - var webClient = new WebClient(); - return webClient.DownloadString(request); - } - catch (Exception ex) - { - Console.WriteLine(ex); - return String.Empty; - } + return new WebClient().DownloadString(request); } } } diff --git a/NzbDrone.Core/Providers/IHttpProvider.cs b/NzbDrone.Core/Providers/IHttpProvider.cs index 8ac6aa43a..00b808ffb 100644 --- a/NzbDrone.Core/Providers/IHttpProvider.cs +++ b/NzbDrone.Core/Providers/IHttpProvider.cs @@ -2,6 +2,6 @@ { public interface IHttpProvider { - string GetRequest(string request); + string DownloadString(string request); } } diff --git a/NzbDrone.Core/Providers/SabProvider.cs b/NzbDrone.Core/Providers/SabProvider.cs index 217991172..04d5a9900 100644 --- a/NzbDrone.Core/Providers/SabProvider.cs +++ b/NzbDrone.Core/Providers/SabProvider.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.Providers _logger.DebugFormat("Adding report [{0}] to the queue.", nzbName); - string response = _http.GetRequest(request).Replace("\n", String.Empty); + string response = _http.DownloadString(request).Replace("\n", String.Empty); _logger.DebugFormat("Queue Repsonse: [{0}]", response); if (response == "ok") @@ -48,7 +48,7 @@ namespace NzbDrone.Core.Providers { string action = "mode=queue&output=xml"; string request = GetSabRequest(action); - string response = _http.GetRequest(request); + string response = _http.DownloadString(request); XDocument xDoc = XDocument.Parse(response); @@ -60,9 +60,9 @@ namespace NzbDrone.Core.Providers return false; //Get the Count of Items in Queue where 'filename' is Equal to goodName, if not zero, return true (isInQueue))) - if ((from s in xDoc.Descendants("slot") where s.Element("filename").Value.Equals(epsiode.FeedItem.TitleFix, StringComparison.InvariantCultureIgnoreCase) select s).Count() != 0) + if ((from s in xDoc.Descendants("slot") where s.Element("filename").Value.Equals(epsiode.FileName, StringComparison.InvariantCultureIgnoreCase) select s).Count() != 0) { - _logger.DebugFormat("Episode in queue - '{0}'", epsiode.FeedItem.TitleFix); + _logger.DebugFormat("Episode in queue - '{0}'", epsiode.FileName); return true; } diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index a4cc149d6..791aa8e55 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -1,7 +1,6 @@ using System.IO; using System.Linq; using log4net; -using NzbDrone.Core.Helpers; using NzbDrone.Core.Repository; using SubSonic.Repository; using TvdbLib.Data; @@ -44,7 +43,7 @@ namespace NzbDrone.Core.Providers foreach (string seriesFolder in _diskProvider.GetDirectories(_config.SeriesRoot)) { - var cleanPath = Disk.CleanPath(new DirectoryInfo(seriesFolder).FullName); + var cleanPath = DiskProvider.CleanPath(new DirectoryInfo(seriesFolder).FullName); if (!_sonioRepo.Exists(s => s.Path == cleanPath)) { _logger.InfoFormat("Folder '{0} isn't mapped to a series in the database. Trying to map it.'", cleanPath); diff --git a/NzbDrone.Core/Repository/Episode.cs b/NzbDrone.Core/Repository/Episode.cs index 2de356d68..a76efdae3 100644 --- a/NzbDrone.Core/Repository/Episode.cs +++ b/NzbDrone.Core/Repository/Episode.cs @@ -8,120 +8,16 @@ namespace NzbDrone.Core.Repository { public class Episode { - //Information about the current episode being processed - - private const string EpisodePattern = @" -(?.*) -(?: - s(?\d+)e(?\d+)-?e(?\d+) -| s(?\d+)e(?\d+) -| (?\d+)x(?\d+) -| (?\d{4}.\d{2}.\d{2}) -) -(?: - (?.*?) - (? - (?:hdtv|pdtv|xvid|ws|720p|x264|bdrip|dvdrip|dsr|proper) - .*) -| (?.*) -) -"; - public FeedItem FeedItem { get; set; } - public string ShowName { get; set; } - public string EpisodeName { get; set; } - public string EpisodeName2 { get; set; } - public int SeasonNumber { get; set; } + public string SeriesId { get; set; } + public string Title { get; set; } + public string Title2 { get; set; } + public int Season { get; set; } public int EpisodeNumber { get; set; } public int EpisodeNumber2 { get; set; } public DateTime AirDate { get; set; } public string Release { get; set; } public int Quality { get; set; } - - public bool IsProper - { - get { return FeedItem.Title.Contains("PROPER"); } - } - - public bool IsDaily - { - get { return AirDate != DateTime.MinValue; } - } - - public bool IsMulti - { - get { return SeasonNumber != 0 && EpisodeNumber != 0 && EpisodeNumber2 != 0; } - } - - public string EpisodeTitle - { - get { return IsDaily ? GetDailyEpisode() : IsMulti ? GetMultiEpisode() : GetSeasonEpisode(); } - } - - public string Title - { - get { return string.Format("{0} - {1}", ShowName, EpisodeTitle); } - } - - public override string ToString() - { - return string.Format("{0} - {1}", ShowName, EpisodeTitle); - } - - private string GetDailyEpisode() - { - return AirDate.ToString("yyyy-MM-dd"); - } - - private string GetMultiEpisode() - { - return string.Format("{0}x{1:D2}-{0}x{2:D2}", SeasonNumber, EpisodeNumber, EpisodeNumber2); - } - - private string GetSeasonEpisode() - { - return string.Format("{0}x{1:D2}", SeasonNumber, EpisodeNumber); - } - - public static Episode Parse(FeedItem feedItem) - { - Match match = Regex.Match(feedItem.Title, EpisodePattern, - RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase); - - if (!match.Success) - return null; - - return new Episode - { - ShowName = ReplaceSeparatorChars(match.Groups["showName"].Value), - SeasonNumber = ParseInt(match.Groups["seasonNumber"].Value), - EpisodeNumber = ParseInt(match.Groups["episodeNumber"].Value), - EpisodeNumber2 = ParseInt(match.Groups["episodeNumber2"].Value), - EpisodeName = ReplaceSeparatorChars(match.Groups["episodeName"].Value), - Release = ReplaceSeparatorChars(match.Groups["release"].Value) - }; - } - - private static string ReplaceSeparatorChars(string s) - { - if (s == null) return string.Empty; - return s.Replace('.', ' ').Replace('-', ' ').Replace('_', ' ').Trim(); - } - - private static int ParseInt(string s) - { - int i; - int.TryParse(s, out i); - return i; - } - - private static DateTime ParseAirDate(string s) - { - DateTime d; - if (DateTime.TryParse(ReplaceSeparatorChars(s).Replace(' ', '-'), out d)) - return d; - return DateTime.MinValue; - } - - + public bool Proper { get; set; } + public String FileName { get; set; } } } diff --git a/NzbDrone.Core/Repository/Quality.cs b/NzbDrone.Core/Repository/Quality.cs new file mode 100644 index 000000000..b1516f103 --- /dev/null +++ b/NzbDrone.Core/Repository/Quality.cs @@ -0,0 +1,35 @@ +namespace NzbDrone.Core.Repository +{ + // ReSharper disable InconsistentNaming + /// + /// Represents Video Quality + /// + public enum Quality + { + /// + /// Quality is unknown + /// + Unknown = 0, + /// + /// SD File (Source could be HD) + /// + SDTV = 1, + /// + /// SD File (DVD Source) + /// + DVD = 2, + /// + /// HD File (HDTV Source) + /// + HDTV = 3, + /// + /// HD File (Online Source) + /// + WEBDL = 4, + /// + /// HD File (Blu-ray Source) + /// + Bluray = 5 + + } +} \ No newline at end of file