1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-10-05 15:47: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;
} }
var parsedEpisode = new EpisodeParseResult
{
SeriesTitle = seriesName,
SeasonNumber = Convert.ToInt32(match[0].Groups["season"].Value),
Year = year,
Episodes = new List<int>()
};
foreach (Match matchGroup in match) foreach (Match matchGroup in match)
{ {
parsedEpisode.Episodes.Add(Convert.ToInt32(matchGroup.Groups["episode"].Value));
var parsedEpisode = new EpisodeParseResult
{
SeriesTitle = seriesName,
SeasonNumber = Convert.ToInt32(matchGroup.Groups["season"].Value),
EpisodeNumber = Convert.ToInt32(matchGroup.Groups["episode"].Value),
Year = year
};
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
} }
} }
@ -111,7 +111,7 @@ internal static SeasonParseResult ParseSeasonInfo(string title)
Year = year Year = year
}; };
Logger.Trace("Season Parsed. {0}", result); Logger.Trace("Season Parsed. {0}", result);
return result; return result;
@ -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
@ -23,7 +24,7 @@ public class RssItemProcessingProvider : IRssItemProcessingProvider
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public RssItemProcessingProvider(ISeriesProvider seriesProvider, ISeasonProvider seasonProvider, public RssItemProcessingProvider(ISeriesProvider seriesProvider, ISeasonProvider seasonProvider,
IEpisodeProvider episodeProvider, IHistoryProvider historyProvider, IEpisodeProvider episodeProvider, IHistoryProvider historyProvider,
IDownloadProvider sabProvider, IConfigProvider configProvider, IDownloadProvider sabProvider, IConfigProvider configProvider,
IHttpProvider httpProvider, IDiskProvider diskProvider) IHttpProvider httpProvider, IDiskProvider diskProvider)
@ -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>(); //Set episode status to grabbed
episodeParseResults.AddRange( //episode.Status = EpisodeStatusType.Grabbed;
episodes.Select(
e =>
new EpisodeParseResult { EpisodeNumber = e.EpisodeNumber, SeasonNumber = e.SeasonNumber }));
return episodeParseResults; //Add to History
}
private void AddToHistory(List<EpisodeParseResult> episodeParseResults, Series series, NzbInfoModel nzb, Indexer indexer) foreach (var episode in episodes)
{
//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
episode.Status = EpisodeStatusType.Grabbed;
//Add to History
var history = new History(); var history = new History();
history.Date = DateTime.Now; history.Date = DateTime.Now;
history.EpisodeId = episode.EpisodeId; history.EpisodeId = episode.EpisodeId;
@ -376,7 +344,7 @@ private bool DownloadNzb(NzbInfoModel nzb)
var filename = path + Path.DirectorySeparatorChar + nzb.TitleFix + ".nzb"; var filename = path + Path.DirectorySeparatorChar + nzb.TitleFix + ".nzb";
if (_httpProvider.DownloadFile(nzb.Link.ToString(), filename)) if (_httpProvider.DownloadFile(nzb.Link.ToString(), filename))
return true; return true;
} }
Logger.Error("Blackhole Directory doesn't exist, not saving NZB: '{0}'", path); Logger.Error("Blackhole Directory doesn't exist, not saving NZB: '{0}'", path);

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