Updated .gitignore to not store .nzb

Add [PROPER] to titleFix if it's a proper.
User can now change the QualityProfile when adding a series (new or existing), option will default to their DefaultQualityProfile.
This commit is contained in:
Mark McDowall 2011-03-28 13:22:12 -07:00
parent c6a7eaab93
commit e62cb3b5da
13 changed files with 103 additions and 26 deletions

3
.gitignore vendored
View File

@ -21,11 +21,12 @@ Thumbs.db
[Dd]ebug*/ [Dd]ebug*/
*.lib *.lib
*.sbr *.sbr
*.nzb
obj/ obj/
[Rr]elease*/ [Rr]elease*/
_ReSharper*/ _ReSharper*/
[Tt]est[Rr]esult[s] [Tt]est[Rr]esult[s]
[Nn]zbs
[Bb]uild/ [Bb]uild/
[Ll]ogs/ [Ll]ogs/
/[Pp]ackage/ /[Pp]ackage/

View File

@ -9,5 +9,6 @@ namespace NzbDrone.Core.Model
{ {
public string Path { get; set; } public string Path { get; set; }
public int TvDbId { get; set; } public int TvDbId { get; set; }
public int QualityProfileId { get; set; }
} }
} }

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.Providers
bool IsMonitored(long id); bool IsMonitored(long id);
TvdbSeries MapPathToSeries(string path); TvdbSeries MapPathToSeries(string path);
TvdbSeries MapPathToSeries(int tvDbId); TvdbSeries MapPathToSeries(int tvDbId);
void AddSeries(string path, TvdbSeries series); void AddSeries(string path, TvdbSeries series, int qualityProfileId);
Series FindSeries(string cleanTitle); Series FindSeries(string cleanTitle);
bool QualityWanted(int seriesId, QualityTypes quality); bool QualityWanted(int seriesId, QualityTypes quality);
void UpdateSeries(Series series); void UpdateSeries(Series series);

View File

@ -7,8 +7,8 @@ namespace NzbDrone.Core.Providers
public interface ISyncProvider public interface ISyncProvider
{ {
bool BeginSyncUnmappedFolders(List<SeriesMappingModel> unmapped); bool BeginSyncUnmappedFolders(List<SeriesMappingModel> unmapped);
bool BeginAddNewSeries(string dir, int seriesId, string seriesName); bool BeginAddNewSeries(string dir, int seriesId, string seriesName, int qualityProfileId);
bool BeginAddExistingSeries(string path, int seriesId); bool BeginAddExistingSeries(string path, int seriesId, int qualityProfileId);
List<String> GetUnmappedFolders(string path); List<String> GetUnmappedFolders(string path);
} }
} }

View File

@ -154,6 +154,10 @@ namespace NzbDrone.Core.Providers
var titleFix = GetTitleFix(new List<EpisodeParseResult> { episode }, episodeModel.SeriesId); var titleFix = GetTitleFix(new List<EpisodeParseResult> { episode }, 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 (nzb.Proper)
titleFix = String.Format("{0} [PROPER]", titleFix);
if (!Convert.ToBoolean(_configProvider.GetValue("UseBlackhole", true, true))) if (!Convert.ToBoolean(_configProvider.GetValue("UseBlackhole", true, true)))
if (_sabProvider.IsInQueue(titleFix)) if (_sabProvider.IsInQueue(titleFix))
return; return;
@ -162,6 +166,10 @@ namespace NzbDrone.Core.Providers
nzb.TitleFix = GetTitleFix(episodeParseResults, series.SeriesId); //Get the TitleFix so we can use it later nzb.TitleFix = GetTitleFix(episodeParseResults, series.SeriesId); //Get the TitleFix so we can use it later
nzb.TitleFix = String.Format("{0} [{1}]", nzb.TitleFix, nzb.Quality); //Add Quality to the titleFix nzb.TitleFix = String.Format("{0} [{1}]", nzb.TitleFix, nzb.Quality); //Add Quality to the titleFix
//If it is a PROPER we want to put PROPER in the titleFix
if (nzb.Proper)
nzb.TitleFix = String.Format("{0} [PROPER]", nzb.TitleFix);
if (Convert.ToBoolean(_configProvider.GetValue("UseBlackHole", true, true))) if (Convert.ToBoolean(_configProvider.GetValue("UseBlackHole", true, true)))
{ {
if (DownloadNzb(nzb)) if (DownloadNzb(nzb))

View File

@ -81,7 +81,7 @@ namespace NzbDrone.Core.Providers
return _tvDb.GetSeries(tvDbId, false); return _tvDb.GetSeries(tvDbId, false);
} }
public void AddSeries(string path, TvdbSeries series) public void AddSeries(string path, TvdbSeries series, int qualityProfileId)
{ {
Logger.Info("Adding Series [{0}]:{1} Path: {2}", series.Id, series.SeriesName, path); Logger.Info("Adding Series [{0}]:{1} Path: {2}", series.Id, series.SeriesName, path);
var repoSeries = new Series(); var repoSeries = new Series();
@ -95,7 +95,10 @@ namespace NzbDrone.Core.Providers
repoSeries.Path = path; repoSeries.Path = path;
repoSeries.CleanTitle = Parser.NormalizeTitle(series.SeriesName); repoSeries.CleanTitle = Parser.NormalizeTitle(series.SeriesName);
repoSeries.Monitored = true; //New shows should be monitored repoSeries.Monitored = true; //New shows should be monitored
repoSeries.QualityProfileId = qualityProfileId;
if (qualityProfileId == 0)
repoSeries.QualityProfileId = Convert.ToInt32(_config.GetValue("DefaultQualityProfile", "1", true)); repoSeries.QualityProfileId = Convert.ToInt32(_config.GetValue("DefaultQualityProfile", "1", true));
repoSeries.SeasonFolder = true; repoSeries.SeasonFolder = true;
if (!Convert.ToBoolean(_config.GetValue("Sorting_SeasonFolder", true, true))) if (!Convert.ToBoolean(_config.GetValue("Sorting_SeasonFolder", true, true)))

View File

@ -90,7 +90,7 @@ namespace NzbDrone.Core.Providers
return true; return true;
} }
public bool BeginAddNewSeries(string dir, int seriesId, string seriesName) public bool BeginAddNewSeries(string dir, int seriesId, string seriesName, int qualityProfileId)
{ {
Logger.Debug("User has requested adding of new series"); Logger.Debug("User has requested adding of new series");
if (_seriesSyncThread == null || !_seriesSyncThread.IsAlive) if (_seriesSyncThread == null || !_seriesSyncThread.IsAlive)
@ -110,7 +110,7 @@ namespace NzbDrone.Core.Providers
_diskProvider.CreateDirectory(path); _diskProvider.CreateDirectory(path);
//Add it to the list so it will be processed //Add it to the list so it will be processed
_syncList.Add(new SeriesMappingModel { Path = path, TvDbId = seriesId }); _syncList.Add(new SeriesMappingModel { Path = path, TvDbId = seriesId, QualityProfileId = qualityProfileId });
_seriesSyncThread.Start(); _seriesSyncThread.Start();
} }
@ -126,7 +126,7 @@ namespace NzbDrone.Core.Providers
return true; return true;
} }
public bool BeginAddExistingSeries(string path, int seriesId) public bool BeginAddExistingSeries(string path, int seriesId, int qualityProfileId)
{ {
Logger.Debug("User has requested adding of new series"); Logger.Debug("User has requested adding of new series");
if (_seriesSyncThread == null || !_seriesSyncThread.IsAlive) if (_seriesSyncThread == null || !_seriesSyncThread.IsAlive)
@ -141,7 +141,7 @@ namespace NzbDrone.Core.Providers
_syncList = new List<SeriesMappingModel>(); _syncList = new List<SeriesMappingModel>();
//Add it to the list so it will be processed //Add it to the list so it will be processed
_syncList.Add(new SeriesMappingModel { Path = path, TvDbId = seriesId }); _syncList.Add(new SeriesMappingModel { Path = path, TvDbId = seriesId, QualityProfileId = qualityProfileId });
_seriesSyncThread.Start(); _seriesSyncThread.Start();
} }
@ -194,7 +194,7 @@ namespace NzbDrone.Core.Providers
if (_seriesProvider.GetSeries(mappedSeries.Id) == null) if (_seriesProvider.GetSeries(mappedSeries.Id) == null)
{ {
_seriesSyncNotification.CurrentStatus = String.Format("{0}: downloading series info...", mappedSeries.SeriesName); _seriesSyncNotification.CurrentStatus = String.Format("{0}: downloading series info...", mappedSeries.SeriesName);
_seriesProvider.AddSeries(seriesFolder.Path, mappedSeries); _seriesProvider.AddSeries(seriesFolder.Path, mappedSeries, seriesFolder.QualityProfileId);
_episodeProvider.RefreshEpisodeInfo(mappedSeries.Id); _episodeProvider.RefreshEpisodeInfo(mappedSeries.Id);
_seriesSyncNotification.CurrentStatus = String.Format("{0}: finding episodes on disk...", mappedSeries.SeriesName); _seriesSyncNotification.CurrentStatus = String.Format("{0}: finding episodes on disk...", mappedSeries.SeriesName);
_mediaFileProvider.Scan(_seriesProvider.GetSeries(mappedSeries.Id)); _mediaFileProvider.Scan(_seriesProvider.GetSeries(mappedSeries.Id));

View File

@ -29,6 +29,7 @@ namespace NzbDrone.Web.Controllers
private readonly IRootDirProvider _rootDirProvider; private readonly IRootDirProvider _rootDirProvider;
private readonly ITvDbProvider _tvDbProvider; private readonly ITvDbProvider _tvDbProvider;
private readonly IDiskProvider _diskProvider; private readonly IDiskProvider _diskProvider;
private readonly IConfigProvider _configProvider;
// //
// GET: /Series/ // GET: /Series/
@ -37,7 +38,8 @@ namespace NzbDrone.Web.Controllers
IEpisodeProvider episodeProvider, IRssSyncProvider rssSyncProvider, IEpisodeProvider episodeProvider, IRssSyncProvider rssSyncProvider,
IQualityProvider qualityProvider, IMediaFileProvider mediaFileProvider, IQualityProvider qualityProvider, IMediaFileProvider mediaFileProvider,
IRenameProvider renameProvider, IRootDirProvider rootDirProvider, IRenameProvider renameProvider, IRootDirProvider rootDirProvider,
ITvDbProvider tvDbProvider, IDiskProvider diskProvider) ITvDbProvider tvDbProvider, IDiskProvider diskProvider,
IConfigProvider configProvider)
{ {
_seriesProvider = seriesProvider; _seriesProvider = seriesProvider;
_episodeProvider = episodeProvider; _episodeProvider = episodeProvider;
@ -49,6 +51,7 @@ namespace NzbDrone.Web.Controllers
_rootDirProvider = rootDirProvider; _rootDirProvider = rootDirProvider;
_tvDbProvider = tvDbProvider; _tvDbProvider = tvDbProvider;
_diskProvider = diskProvider; _diskProvider = diskProvider;
_configProvider = configProvider;
} }
public ActionResult Index() public ActionResult Index()
@ -64,6 +67,13 @@ namespace NzbDrone.Web.Controllers
public ActionResult AddExisting() public ActionResult AddExisting()
{ {
var defaultQuality = Convert.ToInt32(_configProvider.GetValue("DefaultQualityProfile", "1", true));
var profiles = _qualityProvider.GetAllProfiles();
var selectList = new SelectList(profiles, "QualityProfileId", "Name");
ViewData["QualityProfileId"] = defaultQuality;
ViewData["QualitySelectList"] = selectList;
return View(); return View();
} }
@ -72,10 +82,16 @@ namespace NzbDrone.Web.Controllers
ViewData["RootDirs"] = _rootDirProvider.GetAll(); ViewData["RootDirs"] = _rootDirProvider.GetAll();
ViewData["DirSep"] = Path.DirectorySeparatorChar; ViewData["DirSep"] = Path.DirectorySeparatorChar;
var profiles = _qualityProvider.GetAllProfiles();
var selectList = new SelectList(profiles, "QualityProfileId", "Name");
var defaultQuality = Convert.ToInt32(_configProvider.GetValue("DefaultQualityProfile", "1", true));
var model = new AddNewSeriesModel var model = new AddNewSeriesModel
{ {
DirectorySeparatorChar = Path.DirectorySeparatorChar.ToString(), DirectorySeparatorChar = Path.DirectorySeparatorChar.ToString(),
RootDirectories = _rootDirProvider.GetAll() RootDirectories = _rootDirProvider.GetAll(),
QualityProfileId = defaultQuality,
QualitySelectList = selectList
}; };
return View(model); return View(model);
@ -83,9 +99,15 @@ namespace NzbDrone.Web.Controllers
public ActionResult AddExistingManual(string path) public ActionResult AddExistingManual(string path)
{ {
var profiles = _qualityProvider.GetAllProfiles();
var selectList = new SelectList(profiles, "QualityProfileId", "Name");
var defaultQuality = Convert.ToInt32(_configProvider.GetValue("DefaultQualityProfile", "1", true));
var model = new AddExistingManualModel(); var model = new AddExistingManualModel();
model.Path = path; model.Path = path;
model.FolderName = _diskProvider.GetFolderName(path); model.FolderName = _diskProvider.GetFolderName(path);
model.QualityProfileId = defaultQuality;
model.QualitySelectList = selectList;
return View(model); return View(model);
} }
@ -177,11 +199,12 @@ namespace NzbDrone.Web.Controllers
var path = HttpUtility.UrlDecode(nvc["path"]); var path = HttpUtility.UrlDecode(nvc["path"]);
var tvDbId = Convert.ToInt32(HttpUtility.UrlDecode(nvc["tvdbid"])); var tvDbId = Convert.ToInt32(HttpUtility.UrlDecode(nvc["tvdbid"]));
var qualityProfileId = Convert.ToInt32(HttpUtility.UrlDecode(nvc["qualityProfileId"]));
//If the TvDbId for this show is 0 then skip it... User made a mistake... They will have to manually map it //If the TvDbId for this show is 0 then skip it... User made a mistake... They will have to manually map it
if (tvDbId < 1) continue; if (tvDbId < 1) continue;
unmappedList.Add(new SeriesMappingModel{Path = path, TvDbId = tvDbId}); unmappedList.Add(new SeriesMappingModel{Path = path, TvDbId = tvDbId, QualityProfileId = qualityProfileId});
} }
if(_syncProvider.BeginSyncUnmappedFolders(unmappedList)) if(_syncProvider.BeginSyncUnmappedFolders(unmappedList))
@ -190,25 +213,25 @@ namespace NzbDrone.Web.Controllers
return Content("Sync already in progress, please wait for it to complete before retrying."); return Content("Sync already in progress, please wait for it to complete before retrying.");
} }
public ActionResult AddNewSeries(string dir, int seriesId, string seriesName) public ActionResult AddNewSeries(string dir, int seriesId, string seriesName, int qualityProfileId)
{ {
//Get TVDB Series Name //Get TVDB Series Name
//Create new folder for series //Create new folder for series
//Add the new series to the Database //Add the new series to the Database
if (_syncProvider.BeginAddNewSeries(dir, seriesId, seriesName)) if (_syncProvider.BeginAddNewSeries(dir, seriesId, seriesName, qualityProfileId))
return Content("Adding new series has started."); return Content("Adding new series has started.");
return Content("Unable to add new series, please wait for previous scans to complete first."); return Content("Unable to add new series, please wait for previous scans to complete first.");
} }
public ActionResult AddExistingSeries(string path, int seriesId) public ActionResult AddExistingSeries(string path, int seriesId, int qualityProfileId)
{ {
//Get TVDB Series Name //Get TVDB Series Name
//Create new folder for series //Create new folder for series
//Add the new series to the Database //Add the new series to the Database
if (_syncProvider.BeginAddExistingSeries(path, seriesId)) if (_syncProvider.BeginAddExistingSeries(path, seriesId, qualityProfileId))
return Content("Manual adding of existing series has started"); return Content("Manual adding of existing series has started");
return Content("Unable to add existing series, please wait for previous scans to complete first."); return Content("Unable to add existing series, please wait for previous scans to complete first.");

View File

@ -1,7 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Mvc;
namespace NzbDrone.Web.Models namespace NzbDrone.Web.Models
{ {
@ -9,5 +11,10 @@ namespace NzbDrone.Web.Models
{ {
public string Path { get; set; } public string Path { get; set; }
public string FolderName { get; set; } public string FolderName { get; set; }
[DisplayName("Quality Profile")]
public int QualityProfileId { get; set; }
public SelectList QualitySelectList { get; set; }
} }
} }

View File

@ -4,6 +4,7 @@ using System.ComponentModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Mvc;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
namespace NzbDrone.Web.Models namespace NzbDrone.Web.Models
@ -19,5 +20,10 @@ namespace NzbDrone.Web.Models
public string DirectorySeparatorChar { get; set; } public string DirectorySeparatorChar { get; set; }
public List<RootDir> RootDirectories { get; set; } public List<RootDir> RootDirectories { get; set; }
[DisplayName("Quality Profile")]
public int QualityProfileId { get; set; }
public SelectList QualitySelectList { get; set; }
} }
} }

View File

@ -38,6 +38,9 @@
</script> </script>
<%= Html.Label("Quality Profile")%>
<%: Html.DropDownList("qualityProfileId", (SelectList)ViewData["QualitySelectList"], ViewData["QualityProfileId"])%>
<div id="unmappedGrid" style="display:none"> <div id="unmappedGrid" style="display:none">
<% <%
Html.Telerik().Grid<AddExistingSeriesModel>().Name("Unmapped_Series_Folders") Html.Telerik().Grid<AddExistingSeriesModel>().Name("Unmapped_Series_Folders")
@ -105,8 +108,11 @@
return; return;
} }
var qualityProfileId = $("#qualityProfileId").val();
$("#result").load('<%=Url.Action("SyncSelectedSeries", "Series") %>', { $("#result").load('<%=Url.Action("SyncSelectedSeries", "Series") %>', {
checkedRecords: $checkedRecords.map(function () { return jQuery.param({ path: this.name, tvdbid: this.value }) }) checkedRecords: $checkedRecords.map(function () { return jQuery.param({ path: this.name, tvdbid: this.value, qualityProfileId: qualityProfileId }) })
}); });
//Hide the series that we just tried to sync up (uncheck them too, otherwise they will be re-sync'd if we sync again) //Hide the series that we just tried to sync up (uncheck them too, otherwise they will be re-sync'd if we sync again)

View File

@ -22,9 +22,18 @@
<h4><%= Html.Label(Model.Path) %></h4> <h4><%= Html.Label(Model.Path) %></h4>
</div> </div>
<div style="width: 60%">
<div style="display:inline">
<%= Html.Label("Enter a Series Name") %> <%= Html.Label("Enter a Series Name") %>
<%= Html.TextBoxFor(m => m.FolderName, new { id="existing_series_id" }) %> <%= Html.TextBoxFor(m => m.FolderName, new { id="existing_series_id" }) %>
<%= Html.TextBoxFor(m => m.Path, new { id ="series_path", style="display:none" }) %> <%= Html.TextBoxFor(m => m.Path, new { id ="series_path", style="display:none" }) %>
</div>
<div style="display:inline; float:right;">
<%= Html.LabelFor(m => m.QualityProfileId)%>
<%: Html.DropDownListFor(m => m.QualityProfileId, Model.QualitySelectList)%>
</div>
</div>
<p> <p>
<button class="t.button" id="searchButton" disabled="disabled" onclick="searchSeries ()">Search</button> <button class="t.button" id="searchButton" disabled="disabled" onclick="searchSeries ()">Search</button>
@ -72,13 +81,15 @@
var id = "#" + checkedSeries + "_text"; var id = "#" + checkedSeries + "_text";
var seriesName = $(id).val(); var seriesName = $(id).val();
var qualityProfileId = $("#QualityProfileId").val();
var pathTest = $('#series_path').val(); var pathTest = $('#series_path').val();
$('#tester').text(pathTest); $('#tester').text(pathTest);
$("#addResult").load('<%=Url.Action("AddExistingSeries", "Series") %>', { $("#addResult").load('<%=Url.Action("AddExistingSeries", "Series") %>', {
path: pathTest, path: pathTest,
seriesId: checkedSeries seriesId: checkedSeries,
qualityProfileId: qualityProfileId
}); });
} }

View File

@ -20,8 +20,17 @@
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div style="width: 60%">
<div style="display:inline">
<%= Html.Label("Enter a Series Name") %> <%= Html.Label("Enter a Series Name") %>
<%= Html.TextBox("new_series_name", String.Empty, new { id="new_series_id" }) %> <%= Html.TextBox("new_series_name", String.Empty, new { id="new_series_id" }) %>
</div>
<div style="display:inline; float:right;">
<%= Html.LabelFor(m => m.QualityProfileId)%>
<%: Html.DropDownListFor(m => m.QualityProfileId, Model.QualitySelectList)%>
</div>
</div>
<p> <p>
<button class="t.button" id="searchButton" disabled="disabled" onclick="searchSeries ()">Search</button> <button class="t.button" id="searchButton" disabled="disabled" onclick="searchSeries ()">Search</button>
@ -90,11 +99,13 @@
var id = "#" + checkedSeries + "_text"; var id = "#" + checkedSeries + "_text";
var seriesName = $(id).val(); var seriesName = $(id).val();
var qualityProfileId = $("#QualityProfileId").val();
$("#addResult").load('<%=Url.Action("AddNewSeries", "Series") %>', { $("#addResult").load('<%=Url.Action("AddNewSeries", "Series") %>', {
dir: checkedDir, dir: checkedDir,
seriesId: checkedSeries, seriesId: checkedSeries,
seriesName: seriesName seriesName: seriesName,
qualityProfileId: qualityProfileId
}); });
} }