Added support for custom encoding presets to Orchard.Azure.MediaServices.

This commit is contained in:
Daniel Stolt
2014-09-08 19:07:23 +02:00
parent ba5434c729
commit 5965f02b02
14 changed files with 146 additions and 68 deletions

View File

@@ -76,8 +76,8 @@ namespace Orchard.Azure.MediaServices.Controllers {
var presetPattern = new Regex(@"^[\w\s]*$"); var presetPattern = new Regex(@"^[\w\s]*$");
foreach (var preset in viewModel.EncodingSettings.WamsEncodingPresets) { foreach (var preset in viewModel.EncodingSettings.WamsEncodingPresets) {
if (!presetPattern.IsMatch(preset)) { if (!presetPattern.IsMatch(preset.Name)) {
_services.Notifier.Error(T("The encoding preset '{0}' is invalid. Encoding presets can only contain letters, numbers and spaces.", preset)); _services.Notifier.Error(T("The encoding preset name '{0}' is invalid. Encoding presets can only contain letters, numbers and spaces.", preset.Name));
return View("Index", viewModel); return View("Index", viewModel);
} }
} }

View File

@@ -1,4 +1,5 @@
using Orchard.Azure.MediaServices.Models; using System.Linq;
using Orchard.Azure.MediaServices.Models;
using Orchard; using Orchard;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Environment; using Orchard.Environment;
@@ -53,7 +54,7 @@ namespace Orchard.Azure.MediaServices.Events {
"H264 Adaptive Bitrate MP4 Set SD 4x3 for iOS Cellular Only", "H264 Adaptive Bitrate MP4 Set SD 4x3 for iOS Cellular Only",
"H264 Smooth Streaming 720p Xbox Live ADK", "H264 Smooth Streaming 720p Xbox Live ADK",
"H264 Smooth Streaming Windows Phone 7 Series" "H264 Smooth Streaming Windows Phone 7 Series"
}; }.Select(x => new EncodingPreset() { Name = x });
settings.SubtitleLanguages = new[] { settings.SubtitleLanguages = new[] {
"da-DK", "da-DK",
"nl-BE", "nl-BE",

View File

@@ -3,6 +3,7 @@ using System.Globalization;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using System; using System;
using System.Linq; using System.Linq;
using Newtonsoft.Json;
namespace Orchard.Azure.MediaServices.Models { namespace Orchard.Azure.MediaServices.Models {
@@ -18,10 +19,10 @@ namespace Orchard.Azure.MediaServices.Models {
set { this.Store(x => x.WamsAccountKey, value); } set { this.Store(x => x.WamsAccountKey, value); }
} }
public string StorageAccountKey { public string StorageAccountKey {
get { return this.Retrieve(x => x.StorageAccountKey); } get { return this.Retrieve(x => x.StorageAccountKey); }
set { this.Store(x => x.StorageAccountKey, value); } set { this.Store(x => x.StorageAccountKey, value); }
} }
public bool EnableDynamicPackaging { public bool EnableDynamicPackaging {
get { return this.Retrieve(x => x.EnableDynamicPackaging); } get { return this.Retrieve(x => x.EnableDynamicPackaging); }
@@ -49,14 +50,21 @@ namespace Orchard.Azure.MediaServices.Models {
} }
} }
public IEnumerable<string> WamsEncodingPresets { public IEnumerable<EncodingPreset> WamsEncodingPresets {
get { get {
var presets = Retrieve<string>("WamsEncodingPresets"); var presets = Retrieve<string>("WamsEncodingPresetsJson");
return !String.IsNullOrEmpty(presets) ? presets.Split(';') : new string[] { }; if (!String.IsNullOrEmpty(presets)) {
return JsonConvert.DeserializeObject<EncodingPreset[]>(presets);
}
// Fall back to old style property for compatibility with existing data.
presets = Retrieve<string>("WamsEncodingPresets");
var presetNames = !String.IsNullOrEmpty(presets) ? presets.Split(';') : new string[] { };
return presetNames.Select(x => new EncodingPreset() { Name = x });
} }
set { set {
var presets = value != null && value.Any() ? String.Join(";", value) : null; // Clear out old style property, migrate setting to the new one.
Store("WamsEncodingPresets", presets); Store("WamsEncodingPresets", default(string));
Store("WamsEncodingPresetsJson", JsonConvert.SerializeObject(value.ToArray()));
} }
} }

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Orchard.Azure.MediaServices.Models {
public class EncodingPreset {
public string Name { get; set; }
[AllowHtml]
public string CustomXml { get; set; }
}
}

View File

@@ -149,6 +149,7 @@
<Content Include="Content\expressInstall.swf" /> <Content Include="Content\expressInstall.swf" />
<Content Include="Content\MSAdaptiveStreamingPlugin.swf" /> <Content Include="Content\MSAdaptiveStreamingPlugin.swf" />
<Content Include="Content\StrobeMediaPlayback.swf" /> <Content Include="Content\StrobeMediaPlayback.swf" />
<Compile Include="Models\EncodingPreset.cs" />
<Compile Include="Shapes\CloudVideoPlayerShape.cs" /> <Compile Include="Shapes\CloudVideoPlayerShape.cs" />
<Compile Include="Helpers\BitExtensions.cs" /> <Compile Include="Helpers\BitExtensions.cs" />
<Compile Include="Infrastructure\Assets\AssetDriverResult.cs" /> <Compile Include="Infrastructure\Assets\AssetDriverResult.cs" />
@@ -553,6 +554,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Scripts\lib\MPEG Dash Notice.docx" /> <None Include="Scripts\lib\MPEG Dash Notice.docx" />
<Content Include="Styles\cloudmedia-admin-settings.css.map">
<DependentUpon>cloudmedia-admin-settings.css</DependentUpon>
</Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Scripts\cloudmedia-admin-common.js.map" /> <Content Include="Scripts\cloudmedia-admin-common.js.map" />

View File

@@ -15,6 +15,25 @@ var Orchard;
})(); })();
Settings.StringItem = StringItem; Settings.StringItem = StringItem;
var EncodingPreset = (function () {
function EncodingPreset(name, customXml) {
this.name = ko.observable(name);
this.customXml = ko.observable(customXml);
this.isExpanded = ko.observable(false);
this.type = ko.computed(function () {
var customXml = this.customXml();
if (!!customXml && customXml.length > 0)
return "Custom preset";
return "Standard preset";
}, this);
}
EncodingPreset.prototype.toggle = function () {
this.isExpanded(!this.isExpanded());
};
return EncodingPreset;
})();
Settings.EncodingPreset = EncodingPreset;
Settings.clientViewModel = { Settings.clientViewModel = {
wamsEncodingPresets: ko.observableArray(), wamsEncodingPresets: ko.observableArray(),
defaultWamsEncodingPresetIndex: ko.observable(), defaultWamsEncodingPresetIndex: ko.observable(),
@@ -32,7 +51,7 @@ var Orchard;
Settings.deleteWamsEncodingPreset = deleteWamsEncodingPreset; Settings.deleteWamsEncodingPreset = deleteWamsEncodingPreset;
function addNewWamsEncodingPreset() { function addNewWamsEncodingPreset() {
Settings.clientViewModel.wamsEncodingPresets.push(new StringItem("Unnamed")); Settings.clientViewModel.wamsEncodingPresets.push(new EncodingPreset("Unnamed", null));
$("#presets-table tbody:first-of-type tr:last-of-type td:nth-child(2) input").focus().select(); $("#presets-table tbody:first-of-type tr:last-of-type td:nth-child(2) input").focus().select();
} }
Settings.addNewWamsEncodingPreset = addNewWamsEncodingPreset; Settings.addNewWamsEncodingPreset = addNewWamsEncodingPreset;
@@ -49,8 +68,8 @@ var Orchard;
Settings.addNewSubtitleLanguage = addNewSubtitleLanguage; Settings.addNewSubtitleLanguage = addNewSubtitleLanguage;
$(function () { $(function () {
$.each(initWamsEncodingPresets, function (presetIndex, presetName) { $.each(initWamsEncodingPresets, function (presetIndex, preset) {
Settings.clientViewModel.wamsEncodingPresets.push(new StringItem(presetName)); Settings.clientViewModel.wamsEncodingPresets.push(new EncodingPreset(preset.name, preset.customXml));
}); });
Settings.clientViewModel.defaultWamsEncodingPresetIndex(initDefaultWamsEncodingPresetIndex); Settings.clientViewModel.defaultWamsEncodingPresetIndex(initDefaultWamsEncodingPresetIndex);

View File

@@ -1 +1 @@
{"version":3,"file":"cloudmedia-admin-settings.js","sourceRoot":"","sources":["cloudmedia-admin-settings.ts"],"names":["Orchard","Orchard.Azure","Orchard.Azure.MediaServices","Orchard.Azure.MediaServices.Admin","Orchard.Azure.MediaServices.Admin.Settings","Orchard.Azure.MediaServices.Admin.Settings.StringItem","Orchard.Azure.MediaServices.Admin.Settings.StringItem.constructor","Orchard.Azure.MediaServices.Admin.Settings.deleteWamsEncodingPreset","Orchard.Azure.MediaServices.Admin.Settings.addNewWamsEncodingPreset","Orchard.Azure.MediaServices.Admin.Settings.deleteSubtitleLanguage","Orchard.Azure.MediaServices.Admin.Settings.addNewSubtitleLanguage"],"mappings":"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"} {"version":3,"file":"cloudmedia-admin-settings.js","sourceRoot":"","sources":["cloudmedia-admin-settings.ts"],"names":["Orchard","Orchard.Azure","Orchard.Azure.MediaServices","Orchard.Azure.MediaServices.Admin","Orchard.Azure.MediaServices.Admin.Settings","Orchard.Azure.MediaServices.Admin.Settings.StringItem","Orchard.Azure.MediaServices.Admin.Settings.StringItem.constructor","Orchard.Azure.MediaServices.Admin.Settings.EncodingPreset","Orchard.Azure.MediaServices.Admin.Settings.EncodingPreset.constructor","Orchard.Azure.MediaServices.Admin.Settings.EncodingPreset.toggle","Orchard.Azure.MediaServices.Admin.Settings.deleteWamsEncodingPreset","Orchard.Azure.MediaServices.Admin.Settings.addNewWamsEncodingPreset","Orchard.Azure.MediaServices.Admin.Settings.deleteSubtitleLanguage","Orchard.Azure.MediaServices.Admin.Settings.addNewSubtitleLanguage"],"mappings":"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"}

View File

@@ -1,37 +1,56 @@
/// <reference path="typings/jquery.d.ts" /> /// <reference path="typings/jquery.d.ts" />
/// <reference path="typings/knockout.d.ts" /> /// <reference path="typings/knockout.d.ts" />
declare var initWamsEncodingPresets: string[]; declare var initWamsEncodingPresets: any[];
declare var initDefaultWamsEncodingPresetIndex: number; declare var initDefaultWamsEncodingPresetIndex: number;
declare var initSubtitleLanguages: string[]; declare var initSubtitleLanguages: string[];
module Orchard.Azure.MediaServices.Admin.Settings module Orchard.Azure.MediaServices.Admin.Settings {
{
export class StringItem export class StringItem {
{ constructor(value: string) {
constructor(value: string)
{
this.value = ko.observable(value); this.value = ko.observable(value);
} }
public value: KnockoutObservable<string>; public value: KnockoutObservable<string>;
} }
export interface IClientViewModel export class EncodingPreset {
{ constructor(name: string, customXml: string) {
wamsEncodingPresets: KnockoutObservableArray<StringItem>; this.name = ko.observable(name);
this.customXml = ko.observable(customXml);
this.isExpanded = ko.observable(false);
this.type = ko.computed(function () {
var customXml: string = this.customXml();
if (!!customXml && customXml.length > 0)
return "Custom preset";
return "Standard preset";
}, this);
}
public name: KnockoutObservable<string>;
public customXml: KnockoutObservable<string>;
public isExpanded: KnockoutObservable<boolean>;
public type: KnockoutComputed<string>;
public toggle() {
this.isExpanded(!this.isExpanded());
}
}
export interface IClientViewModel {
wamsEncodingPresets: KnockoutObservableArray<EncodingPreset>;
defaultWamsEncodingPresetIndex: KnockoutObservable<number>; defaultWamsEncodingPresetIndex: KnockoutObservable<number>;
subtitleLanguages: KnockoutObservableArray<StringItem>; subtitleLanguages: KnockoutObservableArray<StringItem>;
} }
export var clientViewModel: IClientViewModel = { export var clientViewModel: IClientViewModel = {
wamsEncodingPresets: ko.observableArray<StringItem>(), wamsEncodingPresets: ko.observableArray<EncodingPreset>(),
defaultWamsEncodingPresetIndex: ko.observable<number>(), defaultWamsEncodingPresetIndex: ko.observable<number>(),
subtitleLanguages: ko.observableArray<StringItem>() subtitleLanguages: ko.observableArray<StringItem>()
}; };
export function deleteWamsEncodingPreset(preset: StringItem) export function deleteWamsEncodingPreset(preset: EncodingPreset) {
{
var removedIndex = clientViewModel.wamsEncodingPresets.indexOf(preset); var removedIndex = clientViewModel.wamsEncodingPresets.indexOf(preset);
clientViewModel.wamsEncodingPresets.remove(preset); clientViewModel.wamsEncodingPresets.remove(preset);
if (removedIndex === clientViewModel.defaultWamsEncodingPresetIndex()) if (removedIndex === clientViewModel.defaultWamsEncodingPresetIndex())
@@ -40,34 +59,28 @@ module Orchard.Azure.MediaServices.Admin.Settings
clientViewModel.defaultWamsEncodingPresetIndex(clientViewModel.defaultWamsEncodingPresetIndex() - 1); clientViewModel.defaultWamsEncodingPresetIndex(clientViewModel.defaultWamsEncodingPresetIndex() - 1);
} }
export function addNewWamsEncodingPreset() export function addNewWamsEncodingPreset() {
{ clientViewModel.wamsEncodingPresets.push(new EncodingPreset("Unnamed", null));
clientViewModel.wamsEncodingPresets.push(new StringItem("Unnamed"));
$("#presets-table tbody:first-of-type tr:last-of-type td:nth-child(2) input").focus().select(); $("#presets-table tbody:first-of-type tr:last-of-type td:nth-child(2) input").focus().select();
} }
export function deleteSubtitleLanguage(languageCultureCode: StringItem) export function deleteSubtitleLanguage(languageCultureCode: StringItem) {
{
clientViewModel.subtitleLanguages.remove(languageCultureCode); clientViewModel.subtitleLanguages.remove(languageCultureCode);
} }
export function addNewSubtitleLanguage() export function addNewSubtitleLanguage() {
{
clientViewModel.subtitleLanguages.push(new StringItem("Unnamed")); clientViewModel.subtitleLanguages.push(new StringItem("Unnamed"));
$("#languages-table tbody:first-of-type tr:last-of-type td:nth-child(1) input").focus().select(); $("#languages-table tbody:first-of-type tr:last-of-type td:nth-child(1) input").focus().select();
} }
$(function () $(function () {
{ $.each(initWamsEncodingPresets, function (presetIndex: number, preset: any) {
$.each(initWamsEncodingPresets, function (presetIndex: number, presetName: string) clientViewModel.wamsEncodingPresets.push(new EncodingPreset(preset.name, preset.customXml));
{
clientViewModel.wamsEncodingPresets.push(new StringItem(presetName));
}); });
clientViewModel.defaultWamsEncodingPresetIndex(initDefaultWamsEncodingPresetIndex); clientViewModel.defaultWamsEncodingPresetIndex(initDefaultWamsEncodingPresetIndex);
$.each(initSubtitleLanguages, function (languageIndex: number, languageCultureCode: string) $.each(initSubtitleLanguages, function (languageIndex: number, languageCultureCode: string) {
{
clientViewModel.subtitleLanguages.push(new StringItem(languageCultureCode)); clientViewModel.subtitleLanguages.push(new StringItem(languageCultureCode));
}); });
@@ -80,6 +93,6 @@ module Orchard.Azure.MediaServices.Admin.Settings
localStorage.setItem("selectedCloudMediaSettingsTab", $("#tabs").tabs("option", "active")); localStorage.setItem("selectedCloudMediaSettingsTab", $("#tabs").tabs("option", "active"));
}, },
active: localStorage && localStorage.getItem ? localStorage.getItem("selectedCloudMediaSettingsTab") : null active: localStorage && localStorage.getItem ? localStorage.getItem("selectedCloudMediaSettingsTab") : null
}).show(); }).show();
}); });
} }

View File

@@ -38,8 +38,8 @@ namespace Orchard.Azure.MediaServices.Services.Tasks.Providers {
public override TaskConfiguration Editor(dynamic shapeFactory, IUpdateModel updater) { public override TaskConfiguration Editor(dynamic shapeFactory, IUpdateModel updater) {
var settings = _orchardServices.WorkContext.CurrentSite.As<CloudMediaSettingsPart>(); var settings = _orchardServices.WorkContext.CurrentSite.As<CloudMediaSettingsPart>();
var viewModel = new EncodeViewModel() { var viewModel = new EncodeViewModel() {
EncodingPresets = settings.WamsEncodingPresets, EncodingPresets = settings.WamsEncodingPresets.Select(x => x.Name),
SelectedEncodingPreset = settings.WamsEncodingPresets.Any() ? settings.WamsEncodingPresets.ToArray()[settings.DefaultWamsEncodingPresetIndex] : null SelectedEncodingPreset = settings.WamsEncodingPresets.Any() ? settings.WamsEncodingPresets.ToArray()[settings.DefaultWamsEncodingPresetIndex].Name : null
}; };
if (updater != null) { if (updater != null) {
@@ -66,12 +66,14 @@ namespace Orchard.Azure.MediaServices.Services.Tasks.Providers {
} }
public override ITask CreateTask(TaskConfiguration config, TaskCollection tasks, IEnumerable<IAsset> inputAssets) { public override ITask CreateTask(TaskConfiguration config, TaskCollection tasks, IEnumerable<IAsset> inputAssets) {
var settings = _orchardServices.WorkContext.CurrentSite.As<CloudMediaSettingsPart>();
var viewModel = (EncodeViewModel)config.Settings; var viewModel = (EncodeViewModel)config.Settings;
var encodingPreset = settings.WamsEncodingPresets.Where(x => x.Name == viewModel.SelectedEncodingPreset).Single();
var task = tasks.AddNew( var task = tasks.AddNew(
viewModel.SelectedEncodingPreset, viewModel.SelectedEncodingPreset,
_wamsClient.GetLatestMediaProcessorByName(MediaProcessorName.WindowsAzureMediaEncoder), _wamsClient.GetLatestMediaProcessorByName(MediaProcessorName.WindowsAzureMediaEncoder),
viewModel.SelectedEncodingPreset, !String.IsNullOrEmpty(encodingPreset.CustomXml) ? encodingPreset.CustomXml : encodingPreset.Name,
TaskOptions.None); TaskOptions.None);
task.InputAssets.AddRange(inputAssets); task.InputAssets.AddRange(inputAssets);

View File

@@ -1,35 +1,30 @@
h2 { h2 {
margin-top: 1em !important; margin-top: 1em !important;
} }
#test-button, #test-button,
#save-button { #save-button {
margin-top: 1em; margin-top: 1em;
} }
#presets-table { #presets-table {
width: auto; width: auto;
} }
#presets-table th:nth-child(1), #presets-table th:nth-child(1),
#presets-table th:nth-child(3), #presets-table th:nth-child(4),
#presets-table td:nth-child(1), #presets-table td:nth-child(1),
#presets-table td:nth-child(3) { #presets-table td:nth-child(4) {
text-align: center; text-align: center;
} }
#presets-table td:nth-child(2) { #presets-table td:nth-child(2) {
width: 400px; width: 400px;
} }
#languages-table { #languages-table {
width: auto; width: auto;
/*td:nth-child(2) { /*td:nth-child(2) {
width: 400px; width: 400px;
}*/ }*/
} }
#languages-table th:nth-child(2), #languages-table th:nth-child(2),
#languages-table td:nth-child(2) { #languages-table td:nth-child(2) {
text-align: center; text-align: center;
} }
/*# sourceMappingURL=cloudmedia-admin-settings.css.map */

View File

@@ -0,0 +1,9 @@
{
"version": 3,
"file": "cloudmedia-admin-settings.css",
"sources": [
"cloudmedia-admin-settings.less"
],
"names": [],
"mappings": "AAAA;EACC,0BAAA;;AAGD;AAAc;EACb,eAAA;;AAGD;EACC,WAAA;;AADD,cAEC,GAAE,UAAU;AAFb,cAEkB,GAAE,UAAU;AAF9B,cAEmC,GAAE,UAAU;AAF/C,cAEoD,GAAE,UAAU;EAC9D,kBAAA;;AAHF,cAKC,GAAE,UAAU;EACX,YAAA;;AAIF;EACC,WAAA;;;;;AADD,gBAEC,GAAE,UAAU;AAFb,gBAEkB,GAAE,UAAU;EAC5B,kBAAA"
}

View File

@@ -8,7 +8,7 @@
#presets-table { #presets-table {
width: auto; width: auto;
th:nth-child(1), th:nth-child(3), td:nth-child(1), td:nth-child(3) { th:nth-child(1), th:nth-child(4), td:nth-child(1), td:nth-child(4) {
text-align: center; text-align: center;
} }
td:nth-child(2) { td:nth-child(2) {

View File

@@ -1,8 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using Orchard.Azure.MediaServices.Models;
namespace Orchard.Azure.MediaServices.ViewModels.Settings { namespace Orchard.Azure.MediaServices.ViewModels.Settings {
public class EncodingSettingsViewModel { public class EncodingSettingsViewModel {
public IEnumerable<string> WamsEncodingPresets { get; set; } public IEnumerable<EncodingPreset> WamsEncodingPresets { get; set; }
public int DefaultWamsEncodingPresetIndex { get; set; } public int DefaultWamsEncodingPresetIndex { get; set; }
} }
} }

View File

@@ -1,7 +1,7 @@
@model Orchard.Azure.MediaServices.ViewModels.Settings.EncodingSettingsViewModel @model Orchard.Azure.MediaServices.ViewModels.Settings.EncodingSettingsViewModel
@using (Script.Head()) { @using (Script.Head()) {
<script type="text/javascript"> <script type="text/javascript">
var initWamsEncodingPresets = [ @(Model.WamsEncodingPresets != null && Model.WamsEncodingPresets.Any() ? Html.Raw(String.Join(", ", from s in Model.WamsEncodingPresets select String.Format("'{0}'", s))) : Html.Raw(""))]; var initWamsEncodingPresets = [ @(Model.WamsEncodingPresets != null && Model.WamsEncodingPresets.Any() ? Html.Raw(String.Join(", ", from s in Model.WamsEncodingPresets select String.Format("{{name: '{0}', customXml: '{1}'}}", s.Name, HttpUtility.JavaScriptStringEncode(s.CustomXml)))) : Html.Raw(""))];
var initDefaultWamsEncodingPresetIndex = @Model.DefaultWamsEncodingPresetIndex +0; var initDefaultWamsEncodingPresetIndex = @Model.DefaultWamsEncodingPresetIndex +0;
</script> </script>
} }
@@ -18,13 +18,25 @@
<tr> <tr>
<th scope="col">@T("Default")</th> <th scope="col">@T("Default")</th>
<th scope="col">@T("Name")</th> <th scope="col">@T("Name")</th>
<th scope="col">@T("Type")</th>
<th scope="col"></th> <th scope="col"></th>
</tr> </tr>
</thead> </thead>
<tbody data-bind="foreach: wamsEncodingPresets"> <tbody data-bind="foreach: wamsEncodingPresets">
<tr> <tr>
<td><input type="radio" name="presets-requiredUploads" data-bind="value: $index(), checked: $parent.defaultWamsEncodingPresetIndex" /></td> <td><input type="radio" name="presets-requiredUploads" data-bind="value: $index(), checked: $parent.defaultWamsEncodingPresetIndex" /></td>
<td><input type="text" class="text large" data-bind="value: value, attr: { id: 'EncodingSettings_WamsEncodingPresets_' + $index(), name: 'EncodingSettings.WamsEncodingPresets[' + $index() + ']'}" /></td> <td>
<input type="text" class="text large" data-bind="value: name, attr: { id: 'EncodingSettings_WamsEncodingPresets_' + $index().Name, name: 'EncodingSettings.WamsEncodingPresets[' + $index() + '].Name'}" />
<section class="preset-custom-section" data-bind="visible: isExpanded">
<label>@T("Custom encoding preset XML")</label>
<textarea data-bind="value: customXml, attr: { id: 'EncodingSettings_WamsEncodingPresets_' + $index().CustomXml, name: 'EncodingSettings.WamsEncodingPresets[' + $index() + '].CustomXml'}"></textarea>
<p class="hint">@T("Leave empty if this is standard preset (in which case the name must match a standard Microsoft Azure Media Services encoding preset name.")</p>
</section>
</td>
<td>
<strong data-bind="text: type"></strong>&nbsp;
<a href="#" data-bind="click: toggle">@T("Change")</a>
</td>
<td><a href="#" data-bind="click: Orchard.Azure.MediaServices.Admin.Settings.deleteWamsEncodingPreset">@T("Delete")</a></td> <td><a href="#" data-bind="click: Orchard.Azure.MediaServices.Admin.Settings.deleteWamsEncodingPreset">@T("Delete")</a></td>
</tr> </tr>
</tbody> </tbody>
@@ -33,6 +45,7 @@
<td></td> <td></td>
<td><a href="#" data-bind="click: Orchard.Azure.MediaServices.Admin.Settings.addNewWamsEncodingPreset"><i class="icon-plus-sign icon-large"></i> Add new</a></td> <td><a href="#" data-bind="click: Orchard.Azure.MediaServices.Admin.Settings.addNewWamsEncodingPreset"><i class="icon-plus-sign icon-large"></i> Add new</a></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>