EpisodeSorting setup, setting page created and usable, needs labels still.

This commit is contained in:
markus101 2011-02-25 20:07:22 -08:00
parent 165beda55b
commit 46830a2777
11 changed files with 312 additions and 7 deletions

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NzbDrone.Core.Model;
namespace NzbDrone.Core
{
public static class EpisodeSortingHelper
{
private static readonly List<EpisodeSortingType> SeparatorStyles = new List<EpisodeSortingType>
{
new EpisodeSortingType {Id = 0, Name = "Dash", Pattern = " - "},
new EpisodeSortingType {Id = 1, Name = "Space", Pattern = " "}
};
private static readonly List<EpisodeSortingType> NumberStyles = new List<EpisodeSortingType>
{
new EpisodeSortingType { Id = 0, Name = "1x05", Pattern = "%sx%0e"},
new EpisodeSortingType { Id = 1, Name = "01x05", Pattern = "%0sx%0e"},
new EpisodeSortingType { Id = 2, Name = "S01E05", Pattern = "S%0sE%0e"},
new EpisodeSortingType { Id = 3, Name = "s01e05", Pattern = "s%0se%0e"}
};
private static readonly List<EpisodeSortingType> MultiEpisodeStyles = new List<EpisodeSortingType>
{
new EpisodeSortingType { Id = 0, Name = "Extend", Pattern = "" },
new EpisodeSortingType { Id = 1, Name = "Duplicate", Pattern = "" },
new EpisodeSortingType { Id = 2, Name = "Repeat", Pattern = "" }
};
public static List<EpisodeSortingType> GetSeparatorStyles()
{
return SeparatorStyles;
}
public static List<EpisodeSortingType> GetNumberStyles()
{
return NumberStyles;
}
public static List<EpisodeSortingType> GetMultiEpisodeStyles()
{
return MultiEpisodeStyles;
}
public static EpisodeSortingType GetSeparatorStyle(int id)
{
return SeparatorStyles.Single(s => s.Id == id);
}
public static EpisodeSortingType GetNumberStyle(int id)
{
return NumberStyles.Single(s => s.Id == id);
}
public static EpisodeSortingType GetMultiEpisodeStyle(int id)
{
return MultiEpisodeStyles.Single(s => s.Id == id);
}
public static EpisodeSortingType GetSeparatorStyle(string name)
{
return SeparatorStyles.Single(s => s.Name == name);
}
public static EpisodeSortingType GetNumberStyle(string name)
{
return NumberStyles.Single(s => s.Name == name);
}
public static EpisodeSortingType GetMultiEpisodeStyle(string name)
{
return MultiEpisodeStyles.Single(s => s.Name == name);
}
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model
{
public class EpisodeSortingType
{
public int Id { get; set; }
public string Name { get; set; }
public string Pattern { get; set; }
}
}

View File

@ -156,6 +156,7 @@
<Reference Include="UPnP, Version=1.0.3932.37442, Culture=neutral, processorArchitecture=MSIL" /> <Reference Include="UPnP, Version=1.0.3932.37442, Culture=neutral, processorArchitecture=MSIL" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="EpisodeSortingHelper.cs" />
<Compile Include="Instrumentation\ILogProvider.cs" /> <Compile Include="Instrumentation\ILogProvider.cs" />
<Compile Include="Instrumentation\LogLevel.cs" /> <Compile Include="Instrumentation\LogLevel.cs" />
<Compile Include="Instrumentation\LogProvider.cs" /> <Compile Include="Instrumentation\LogProvider.cs" />
@ -165,6 +166,7 @@
<Compile Include="Model\EpisodeParseResult.cs" /> <Compile Include="Model\EpisodeParseResult.cs" />
<Compile Include="Model\EpisodeModel.cs" /> <Compile Include="Model\EpisodeModel.cs" />
<Compile Include="Model\EpisodeRenameModel.cs" /> <Compile Include="Model\EpisodeRenameModel.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" />

View File

@ -208,7 +208,7 @@ namespace NzbDrone.Core.Providers
private string GetSeasonFolder(int seasonNumber) private string GetSeasonFolder(int seasonNumber)
{ {
return return
_configProvider.GetValue("SeasonFolder", "Season %s", true).Replace("%s", seasonNumber.ToString()). _configProvider.GetValue("Sorting_SeasonFolderFormat", "Season %s", true).Replace("%s", seasonNumber.ToString()).
Replace("%0s", seasonNumber.ToString("00")); Replace("%0s", seasonNumber.ToString("00"));
} }
} }

View File

@ -113,7 +113,7 @@ namespace NzbDrone.Core.Providers
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("SeasonFolder", true, true))) if (!Convert.ToBoolean(_config.GetValue("Sorting_SeasonFolder", true, true)))
repoSeries.SeasonFolder = false; repoSeries.SeasonFolder = false;
_sonioRepo.Add(repoSeries); _sonioRepo.Add(repoSeries);

View File

@ -5,6 +5,7 @@ using System.Threading;
using System.Web; using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
using NLog; using NLog;
using NzbDrone.Core;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Repository.Quality;
@ -120,6 +121,30 @@ namespace NzbDrone.Web.Controllers
return View("Index", model); return View("Index", model);
} }
public ActionResult EpisodeSorting()
{
ViewData["viewName"] = "EpisodeSorting";
var model = new EpisodeSortingModel();
model.ShowName = Convert.ToBoolean(_configProvider.GetValue("Sorting_ShowName", true, true));
model.EpisodeName = Convert.ToBoolean(_configProvider.GetValue("Sorting_EpisodeName", true, true));
model.ReplaceSpaces = Convert.ToBoolean(_configProvider.GetValue("Sorting_ReplaceSpaces", false, true));
model.AppendQuality = Convert.ToBoolean(_configProvider.GetValue("Sorting_AppendQuality", false, true));
model.UseAirByDate = Convert.ToBoolean(_configProvider.GetValue("Sorting_UseAirByDate", true, true));
model.SeasonFolders = Convert.ToBoolean(_configProvider.GetValue("Sorting_SeasonFolder", true, true));
model.SeasonFolderFormat = _configProvider.GetValue("Sorting_SeasonFolderFormat", "Season %s", true);
model.SeparatorStyle = Convert.ToInt32(_configProvider.GetValue("Sorting_SeparatorStyle", 0, true));
model.NumberStyle = Convert.ToInt32(_configProvider.GetValue("Sorting_NumberStyle", 2, true));
model.MultiEpisodeStyle = Convert.ToInt32(_configProvider.GetValue("Sorting_MultiEpisodeStyle", 0, true));
model.SeparatorStyles = new SelectList(EpisodeSortingHelper.GetSeparatorStyles(), "Id", "Name");
model.NumberStyles = new SelectList(EpisodeSortingHelper.GetNumberStyles(), "Id", "Name");
model.MultiEpisodeStyles = new SelectList(EpisodeSortingHelper.GetMultiEpisodeStyles(), "Id", "Name");
return View("Index", model);
}
public ViewResult AddUserProfile() public ViewResult AddUserProfile()
{ {
var qualityTypes = new List<QualityTypes>(); var qualityTypes = new List<QualityTypes>();
@ -249,5 +274,27 @@ namespace NzbDrone.Web.Controllers
return Content(_settingsFailed); return Content(_settingsFailed);
} }
[HttpPost]
public ActionResult SaveEpisodeSorting(EpisodeSortingModel data)
{
if (ModelState.IsValid)
{
_configProvider.SetValue("Sorting_ShowName", data.ShowName.ToString());
_configProvider.SetValue("Sorting_EpisodeName", data.EpisodeName.ToString());
_configProvider.SetValue("Sorting_ReplaceSpaces", data.ReplaceSpaces.ToString());
_configProvider.SetValue("Sorting_AppendQuality", data.AppendQuality.ToString());
_configProvider.SetValue("Sorting_UseAirByDate", data.UseAirByDate.ToString());
_configProvider.SetValue("Sorting_SeasonFolder", data.SeasonFolders.ToString());
_configProvider.SetValue("Sorting_SeasonFolderFormat", data.SeasonFolderFormat);
_configProvider.SetValue("Sorting_SeparatorStyle", data.SeparatorStyle.ToString());
_configProvider.SetValue("Sorting_NumberStyle", data.NumberStyle.ToString());
_configProvider.SetValue("Sorting_MultiEpisodeStyle", data.MultiEpisodeStyle.ToString());
return Content(_settingsSaved);
}
return Content(_settingsFailed);
}
} }
} }

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NzbDrone.Core.Model;
namespace NzbDrone.Web.Models
{
public class EpisodeSortingModel
{
public bool ShowName { get; set; }
public bool EpisodeName { get; set; }
public bool ReplaceSpaces { get; set; }
public bool AppendQuality { get; set; }
public bool UseAirByDate { get; set; }
public bool SeasonFolders { get; set; }
public string SeasonFolderFormat { get; set; }
public int SeparatorStyle { get; set; }
public int NumberStyle { get; set; }
public int MultiEpisodeStyle { get; set; }
public SelectList SeparatorStyles { get; set; }
public SelectList NumberStyles { get; set; }
public SelectList MultiEpisodeStyles { get; set; }
}
}

View File

@ -86,6 +86,7 @@
<Compile Include="Helpers\IsCurrentActionHelper.cs" /> <Compile Include="Helpers\IsCurrentActionHelper.cs" />
<Compile Include="Models\AccountModels.cs" /> <Compile Include="Models\AccountModels.cs" />
<Compile Include="Models\DownloadSettingsModel.cs" /> <Compile Include="Models\DownloadSettingsModel.cs" />
<Compile Include="Models\EpisodeSortingModel.cs" />
<Compile Include="Models\IndexerSettingsModel.cs" /> <Compile Include="Models\IndexerSettingsModel.cs" />
<Compile Include="Models\MappingModel.cs" /> <Compile Include="Models\MappingModel.cs" />
<Compile Include="Models\EpisodeModel.cs" /> <Compile Include="Models\EpisodeModel.cs" />
@ -272,6 +273,7 @@
<Content Include="Views\Series\index.aspx" /> <Content Include="Views\Series\index.aspx" />
<Content Include="Views\Series\Unmapped.aspx" /> <Content Include="Views\Series\Unmapped.aspx" />
<Content Include="Views\Settings\Downloads.ascx" /> <Content Include="Views\Settings\Downloads.ascx" />
<Content Include="Views\Settings\EpisodeSorting.ascx" />
<Content Include="Views\Settings\General.ascx" /> <Content Include="Views\Settings\General.ascx" />
<Content Include="Views\Settings\Index.aspx" /> <Content Include="Views\Settings\Index.aspx" />
<Content Include="Views\Settings\Indexers.ascx" /> <Content Include="Views\Settings\Indexers.ascx" />

View File

@ -57,6 +57,14 @@
<%: Html.CheckBoxFor(model => model.Monitored) %> <%: Html.CheckBoxFor(model => model.Monitored) %>
<%: Html.ValidationMessageFor(model => model.Monitored) %> <%: Html.ValidationMessageFor(model => model.Monitored) %>
</div> </div>
<div class="editor-label">
<%: Html.LabelFor(model => model.SeasonFolder) %>
</div>
<div class="editor-field">
<%: Html.CheckBoxFor(model => model.SeasonFolder)%>
<%: Html.ValidationMessageFor(model => model.SeasonFolder)%>
</div>
<div class="editor-label"> <div class="editor-label">
<%: Html.LabelFor(model => model.QualityProfileId) %> <%: Html.LabelFor(model => model.QualityProfileId) %>

View File

@ -0,0 +1,126 @@
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NzbDrone.Web.Models.EpisodeSortingModel>" %>
<script type="text/javascript">
$(document).ready(function () {
var options = {
target: '#result',
beforeSubmit: showRequest,
success: showResponse,
type: 'post',
resetForm: false
};
$('#form').ajaxForm(options);
$('#save_button').attr('disabled', '');
});
function showRequest(formData, jqForm, options) {
$("#result").empty().html('Saving...');
$("#form :input").attr("disabled", true);
}
function showResponse(responseText, statusText, xhr, $form) {
$("#result").empty().html(responseText);
$("#form :input").attr("disabled", false);
}
</script>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm("SaveEpisodeSorting", "Settings", FormMethod.Post, new { id = "form", name = "form" }))
{%>
<%--<%: Html.ValidationSummary(true, "Unable to save your settings. Please correct the errors and try again.") %>--%>
<fieldset>
<legend>Episode Sorting</legend>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.ShowName)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.ShowName)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.ShowName)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.EpisodeName)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.EpisodeName)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.EpisodeName)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.ReplaceSpaces)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.ReplaceSpaces)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.ReplaceSpaces)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.AppendQuality)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.AppendQuality)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.AppendQuality)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.UseAirByDate)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.UseAirByDate)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.UseAirByDate)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.SeasonFolders)%></div>
<div class="config-value"><%= Html.CheckBoxFor(m => m.SeasonFolders)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.SeasonFolders)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.SeasonFolderFormat)%></div>
<div class="config-value"><%= Html.TextBoxFor(m => m.SeasonFolderFormat)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.SeasonFolderFormat)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.SeparatorStyle) %></div>
<div class="config-value"><%= Html.DropDownListFor(m => m.SeparatorStyle, Model.SeparatorStyles)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.SeparatorStyle)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.NumberStyle) %></div>
<div class="config-value"><%= Html.DropDownListFor(m => m.NumberStyle, Model.NumberStyles)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.NumberStyle)%></div>
</div>
<div class="config-section">
<div class="config-group">
<div class="config-title"><%= Html.LabelFor(m => m.MultiEpisodeStyle) %></div>
<div class="config-value"><%= Html.DropDownListFor(m => m.MultiEpisodeStyle, Model.MultiEpisodeStyles)%></div>
</div>
<div class="config-validation"><%= Html.ValidationMessageFor(m => m.MultiEpisodeStyle)%></div>
</div>
<input type="submit" id="save_button" value="Save" disabled="disabled" />
<% } %>
</fieldset>
<div id="result"></div>

View File

@ -3,11 +3,14 @@
<%@ Import Namespace="Telerik.Web.Mvc.UI" %> <%@ Import Namespace="Telerik.Web.Mvc.UI" %>
<% <%
Html.Telerik().Menu().Name("Menu").Items(items => {items.Add().Text("General").Action("General", "Settings"); }) Html.Telerik().Menu().Name("Menu").Items(items =>
.Items(items => items.Add().Text("Indexers").Action("Indexers", "Settings")) {
.Items(items => items.Add().Text("Downloads").Action("Downloads", "Settings")) items.Add().Text("General").Action("General", "Settings");
.Items(items => items.Add().Text("Quality").Action("Quality", "Settings")) items.Add().Text("Indexers").Action("Indexers", "Settings");
.Render(); items.Add().Text("Downloads").Action("Downloads", "Settings");
items.Add().Text("Quality").Action("Quality", "Settings");
items.Add().Text("Episode Sorting").Action("EpisodeSorting", "Settings");
}).Render();
%> %>