diff --git a/Source/FileLiberator/DownloadOptions.Factory.cs b/Source/FileLiberator/DownloadOptions.Factory.cs index 83cf93de..cfccd55c 100644 --- a/Source/FileLiberator/DownloadOptions.Factory.cs +++ b/Source/FileLiberator/DownloadOptions.Factory.cs @@ -33,81 +33,78 @@ public partial class DownloadOptions private static async Task ChooseContent(Api api, LibraryBook libraryBook, Configuration config) { - var cdm = await Cdm.GetCdmAsync(); - var dlQuality = config.FileDownloadQuality == Configuration.DownloadQuality.Normal ? DownloadQuality.Normal : DownloadQuality.High; - ContentLicense? contentLic = null; - ContentLicense? fallback = null; + if (!config.UseWidevine || await Cdm.GetCdmAsync() is not Cdm cdm) + return await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); - if (cdm is null) + ContentLicense? contentLic = null, fallback = null; + + try { - //Doesn't matter what the user chose. We can't get a CDM so we must fall back to AAX(C) - contentLic = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); + //try to request a widevine content license using the user's spatial audio settings + var codecChoice = config.SpatialAudioCodec switch + { + Configuration.SpatialCodec.EC_3 => Ec3Codec, + Configuration.SpatialCodec.AC_4 => Ac4Codec, + _ => throw new NotSupportedException($"Unknown value for {nameof(config.SpatialAudioCodec)}") + }; + + contentLic + = await api.GetDownloadLicenseAsync( + libraryBook.Book.AudibleProductId, + dlQuality, + ChapterTitlesType.Tree, + DrmType.Widevine, + config.RequestSpatial, + codecChoice); } - else + catch (Exception ex) { - var spatial = config.FileDownloadQuality is Configuration.DownloadQuality.Spatial; - try - { - var codecChoice = config.SpatialAudioCodec switch - { - Configuration.SpatialCodec.EC_3 => Ec3Codec, - Configuration.SpatialCodec.AC_4 => Ac4Codec, - _ => throw new NotSupportedException($"Unknown value for {nameof(config.SpatialAudioCodec)}") - }; - contentLic = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality, ChapterTitlesType.Tree, DrmType.Widevine, spatial, codecChoice); - } - catch (Exception ex) - { - Serilog.Log.Logger.Error(ex, "Failed to request a Widevine license."); - } - - if (contentLic is null) - { - //We failed to get a widevine license, so fall back to AAX(C) - contentLic = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); - } - else if (!contentLic.ContentMetadata.ContentReference.IsSpatial && contentLic.DrmType != DrmType.Adrm) - { - /* - We got a widevine license and we have a Cdm, but we still need to decide if we WANT the file - being delivered with widevine. This file is not "spatial", so it may be no better than the - audio in the Adrm files. All else being equal, we prefer Adrm files because they have more - build-in metadata and always AAC-LC, which is a codec playable by pretty much every device - in existence. - - Unfortunately, there appears to be no way to determine which codec/quality combination we'll - get until we make the request and see what content gets delivered. For some books, - Widevine/High delivers 44.1 kHz / 128 kbps audio and Adrm/High delivers 22.05 kHz / 64 kbps. - In those cases, the Widevine content size is much larger. Other books will deliver the same - sample rate / bitrate for both Widevine and Adrm, the only difference being codec. Widevine - is usually xHE-AAC, but is sometimes AAC-LC. Adrm is always AAC-LC. - - To decide which file we want, use this simple rule: if files are different codecs and - Widevine is significantly larger, use Widevine. Otherwise use ADRM. - - */ - fallback = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); - - var wvCr = contentLic.ContentMetadata.ContentReference; - var adrmCr = fallback.ContentMetadata.ContentReference; - - if (wvCr.Codec == adrmCr.Codec || - adrmCr.ContentSizeInBytes > wvCr.ContentSizeInBytes || - RelativePercentDifference(adrmCr.ContentSizeInBytes, wvCr.ContentSizeInBytes) < 0.05) - { - contentLic = fallback; - } - } + Serilog.Log.Logger.Error(ex, "Failed to request a Widevine license."); + //We failed to get a widevine license, so fall back to AAX(C) + return await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); } - if (contentLic.DrmType == DrmType.Widevine && cdm is not null) + if (!contentLic.ContentMetadata.ContentReference.IsSpatial && contentLic.DrmType != DrmType.Adrm) + { + /* + We got a widevine license and we have a Cdm, but we still need to decide if we WANT the file + being delivered with widevine. This file is not "spatial", so it may be no better than the + audio in the Adrm files. All else being equal, we prefer Adrm files because they have more + build-in metadata and always AAC-LC, which is a codec playable by pretty much every device + in existence. + + Unfortunately, there appears to be no way to determine which codec/quality combination we'll + get until we make the request and see what content gets delivered. For some books, + Widevine/High delivers 44.1 kHz / 128 kbps audio and Adrm/High delivers 22.05 kHz / 64 kbps. + In those cases, the Widevine content size is much larger. Other books will deliver the same + sample rate / bitrate for both Widevine and Adrm, the only difference being codec. Widevine + is usually xHE-AAC, but is sometimes AAC-LC. Adrm is always AAC-LC. + + To decide which file we want, use this simple rule: if files are different codecs and + Widevine is significantly larger, use Widevine. Otherwise use ADRM. + */ + + fallback = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId, dlQuality); + + var wvCr = contentLic.ContentMetadata.ContentReference; + var adrmCr = fallback.ContentMetadata.ContentReference; + + if (wvCr.Codec == adrmCr.Codec || + adrmCr.ContentSizeInBytes > wvCr.ContentSizeInBytes || + RelativePercentDifference(adrmCr.ContentSizeInBytes, wvCr.ContentSizeInBytes) < 0.05) + { + contentLic = fallback; + } + } + + if (contentLic.DrmType == DrmType.Widevine) { try { using var client = new HttpClient(); - var mpdResponse = await client.GetAsync(contentLic.LicenseResponse); + using var mpdResponse = await client.GetAsync(contentLic.LicenseResponse); var dash = new MpegDash(mpdResponse.Content.ReadAsStream()); if (!dash.TryGetUri(new Uri(contentLic.LicenseResponse), out var contentUri)) @@ -124,7 +121,6 @@ public partial class DownloadOptions Key = Convert.ToHexStringLower(keys[0].Kid.ToByteArray()), Iv = Convert.ToHexStringLower(keys[0].Key) }; - } catch { diff --git a/Source/LibationAvalonia/Controls/Settings/Audio.axaml b/Source/LibationAvalonia/Controls/Settings/Audio.axaml index fc0b09eb..e99477ae 100644 --- a/Source/LibationAvalonia/Controls/Settings/Audio.axaml +++ b/Source/LibationAvalonia/Controls/Settings/Audio.axaml @@ -43,14 +43,40 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs index c2be0cfc..6f247581 100644 --- a/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs +++ b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs @@ -22,21 +22,21 @@ namespace LibationAvalonia.Controls.Settings } } - - public async void Quality_SelectionChanged(object sender, SelectionChangedEventArgs e) + private async void UseWidevine_IsCheckedChanged(object sender, Avalonia.Interactivity.RoutedEventArgs e) { - if (_viewModel.SpatialSelected) + if (sender is CheckBox cbox && cbox.IsChecked is true) { using var accounts = AudibleApiStorage.GetAccountsSettingsPersister(); if (!accounts.AccountsSettings.Accounts.Any(a => a.IdentityTokens.DeviceType == AudibleApi.Resources.DeviceType)) { - await MessageBox.Show(VisualRoot as Window, - "Your must remove account(s) from Libation and then re-add them to enable spatial audiobook downloads.", - "Spatial Audio Unavailable", + if (VisualRoot is Window parent) + await MessageBox.Show(parent, + "Your must remove account(s) from Libation and then re-add them to enable widwvine content.", + "Widevine Content Unavailable", MessageBoxButtons.OK); - _viewModel.FileDownloadQuality = _viewModel.DownloadQualities[1]; + _viewModel.UseWidevine = false; } } } diff --git a/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs index 7f923cc0..17fb37e9 100644 --- a/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs +++ b/Source/LibationAvalonia/ViewModels/Settings/AudioSettingsVM.cs @@ -67,6 +67,8 @@ namespace LibationAvalonia.ViewModels.Settings FileDownloadQuality = DownloadQualities.SingleOrDefault(s => s.Value == config.FileDownloadQuality) ?? DownloadQualities[0]; SelectedSampleRate = SampleRates.SingleOrDefault(s => s.Value == config.MaxSampleRate) ?? SampleRates[0]; SelectedEncoderQuality = config.LameEncoderQuality; + UseWidevine = config.UseWidevine; + RequestSpatial = config.RequestSpatial; } public void SaveSettings(Configuration config) @@ -96,12 +98,13 @@ namespace LibationAvalonia.ViewModels.Settings config.MaxSampleRate = SelectedSampleRate?.Value ?? config.MaxSampleRate; config.FileDownloadQuality = FileDownloadQuality?.Value ?? config.FileDownloadQuality; config.SpatialAudioCodec = SpatialAudioCodec?.Value ?? config.SpatialAudioCodec; + config.UseWidevine = UseWidevine; + config.RequestSpatial = RequestSpatial; } public AvaloniaList> DownloadQualities { get; } = new([ new EnumDisplay(Configuration.DownloadQuality.Normal), new EnumDisplay(Configuration.DownloadQuality.High), - new EnumDisplay(Configuration.DownloadQuality.Spatial, "Spatial (if available)"), ]); public AvaloniaList> SpatialAudioCodecs { get; } = new([ new EnumDisplay(Configuration.SpatialCodec.EC_3, "Dolby Digital Plus (E-AC-3)"), @@ -109,6 +112,10 @@ namespace LibationAvalonia.ViewModels.Settings ]); public AvaloniaList ClipBookmarkFormats { get; } = new(Enum.GetValues()); public string FileDownloadQualityText { get; } = Configuration.GetDescription(nameof(Configuration.FileDownloadQuality)); + public string UseWidevineText { get; } = Configuration.GetDescription(nameof(Configuration.UseWidevine)); + public string UseWidevineTip { get; } = Configuration.GetHelpText(nameof(Configuration.UseWidevine)); + public string RequestSpatialText { get; } = Configuration.GetDescription(nameof(Configuration.RequestSpatial)); + public string RequestSpatialTip { get; } = Configuration.GetHelpText(nameof(Configuration.RequestSpatial)); public string SpatialAudioCodecText { get; } = Configuration.GetDescription(nameof(Configuration.SpatialAudioCodec)); public string SpatialAudioCodecTip { get; } = Configuration.GetHelpText(nameof(Configuration.SpatialAudioCodec)); public string CreateCueSheetText { get; } = Configuration.GetDescription(nameof(Configuration.CreateCueSheet)); @@ -133,19 +140,13 @@ namespace LibationAvalonia.ViewModels.Settings public string RetainAaxFileTip => Configuration.GetHelpText(nameof(RetainAaxFile)); public bool DownloadClipsBookmarks { get => _downloadClipsBookmarks; set => this.RaiseAndSetIfChanged(ref _downloadClipsBookmarks, value); } - public bool SpatialSelected { get; private set; } - private EnumDisplay? _fileDownloadQuality; - public EnumDisplay FileDownloadQuality - { - get => _fileDownloadQuality ?? DownloadQualities[0]; - set - { - SpatialSelected = value?.Value == Configuration.DownloadQuality.Spatial; - this.RaiseAndSetIfChanged(ref _fileDownloadQuality, value); - this.RaisePropertyChanged(nameof(SpatialSelected)); - } - } + private bool _useWidevine; + private bool _requestSpatial; + public bool UseWidevine { get => _useWidevine; set => this.RaiseAndSetIfChanged(ref _useWidevine, value); } + public bool RequestSpatial { get => _requestSpatial; set => this.RaiseAndSetIfChanged(ref _requestSpatial, value); } + + public EnumDisplay FileDownloadQuality { get; set; } public EnumDisplay SpatialAudioCodec { get; set; } public Configuration.ClipBookmarkFormat ClipBookmarkFormat { get; set; } public bool MergeOpeningAndEndCredits { get; set; } diff --git a/Source/LibationFileManager/Configuration.HelpText.cs b/Source/LibationFileManager/Configuration.HelpText.cs index 8fdefaa8..26371122 100644 --- a/Source/LibationFileManager/Configuration.HelpText.cs +++ b/Source/LibationFileManager/Configuration.HelpText.cs @@ -89,6 +89,24 @@ namespace LibationFileManager AC-4 cannot be converted to MP3. """ }, + {nameof(UseWidevine), """ + Some audiobooks are only delivered in the highest + available quality with special, third-party content + protection. Enabling this option will make Libation + request audiobooks with Widevine DRM, which may + yield higher quality audiobook files. If they are + higher quality, however, they will also be encoded + with a somewhat uncommon codec (xHE-AAC USAC) + which you may have difficulty playing. + + This must be enable to download spatial audiobooks. + """ }, + {nameof(RequestSpatial), """ + If selected, Libation will request audiobooks in the + Dolby Atmos 'Spatial Audio' format. Audiobooks which + don't have a spatial audio version will be download + as usual based on your other file quality settings. + """ }, } .AsReadOnly(); diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index c2c58c50..7da1c25c 100644 --- a/Source/LibationFileManager/Configuration.PersistentSettings.cs +++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs @@ -246,8 +246,7 @@ namespace LibationFileManager public enum DownloadQuality { High, - Normal, - Spatial + Normal } [JsonConverter(typeof(StringEnumConverter))] @@ -257,6 +256,12 @@ namespace LibationFileManager AC_4 } + [Description("Use widevine DRM")] + public bool UseWidevine { get => GetNonString(defaultValue: true); set => SetNonString(value); } + + [Description("Request Spatial Audio")] + public bool RequestSpatial { get => GetNonString(defaultValue: true); set => SetNonString(value); } + [Description("Spatial audio codec:")] public SpatialCodec SpatialAudioCodec { get => GetNonString(defaultValue: SpatialCodec.EC_3); set => SetNonString(value); } diff --git a/Source/LibationWinForms/Dialogs/SettingsDialog.AudioSettings.cs b/Source/LibationWinForms/Dialogs/SettingsDialog.AudioSettings.cs index 1127125a..c894e5ca 100644 --- a/Source/LibationWinForms/Dialogs/SettingsDialog.AudioSettings.cs +++ b/Source/LibationWinForms/Dialogs/SettingsDialog.AudioSettings.cs @@ -23,6 +23,8 @@ namespace LibationWinForms.Dialogs this.stripAudibleBrandingCbox.Text = desc(nameof(config.StripAudibleBrandAudio)); this.stripUnabridgedCbox.Text = desc(nameof(config.StripUnabridged)); this.moveMoovAtomCbox.Text = desc(nameof(config.MoveMoovToBeginning)); + this.useWidevineCbox.Text = desc(nameof(config.UseWidevine)); + this.requestSpatialCbox.Text = desc(nameof(config.RequestSpatial)); this.spatialCodecLbl.Text = desc(nameof(config.SpatialAudioCodec)); toolTip.SetToolTip(combineNestedChapterTitlesCbox, Configuration.GetHelpText(nameof(config.CombineNestedChapterTitles))); @@ -34,6 +36,8 @@ namespace LibationWinForms.Dialogs toolTip.SetToolTip(mergeOpeningEndCreditsCbox, Configuration.GetHelpText(nameof(config.MergeOpeningAndEndCredits))); toolTip.SetToolTip(retainAaxFileCbox, Configuration.GetHelpText(nameof(config.RetainAaxFile))); toolTip.SetToolTip(stripAudibleBrandingCbox, Configuration.GetHelpText(nameof(config.StripAudibleBrandAudio))); + toolTip.SetToolTip(useWidevineCbox, Configuration.GetHelpText(nameof(config.UseWidevine))); + toolTip.SetToolTip(requestSpatialCbox, Configuration.GetHelpText(nameof(config.RequestSpatial))); toolTip.SetToolTip(spatialCodecLbl, Configuration.GetHelpText(nameof(config.SpatialAudioCodec))); toolTip.SetToolTip(spatialAudioCodecCb, Configuration.GetHelpText(nameof(config.SpatialAudioCodec))); @@ -41,7 +45,6 @@ namespace LibationWinForms.Dialogs [ new EnumDisplay(Configuration.DownloadQuality.Normal), new EnumDisplay(Configuration.DownloadQuality.High), - new EnumDisplay(Configuration.DownloadQuality.Spatial, "Spatial (if available)"), ]); spatialAudioCodecCb.Items.AddRange( @@ -76,6 +79,8 @@ namespace LibationWinForms.Dialogs downloadClipsBookmarksCbox.Checked = config.DownloadClipsBookmarks; fileDownloadQualityCb.SelectedItem = config.FileDownloadQuality; spatialAudioCodecCb.SelectedItem = config.SpatialAudioCodec; + useWidevineCbox.Checked = config.UseWidevine; + requestSpatialCbox.Checked = config.RequestSpatial; clipsBookmarksFormatCb.SelectedItem = config.ClipsBookmarksFileFormat; retainAaxFileCbox.Checked = config.RetainAaxFile; @@ -118,6 +123,8 @@ namespace LibationWinForms.Dialogs config.DownloadCoverArt = downloadCoverArtCbox.Checked; config.DownloadClipsBookmarks = downloadClipsBookmarksCbox.Checked; config.FileDownloadQuality = ((EnumDisplay)fileDownloadQualityCb.SelectedItem).Value; + config.UseWidevine = useWidevineCbox.Checked; + config.RequestSpatial = requestSpatialCbox.Checked; config.SpatialAudioCodec = ((EnumDisplay)spatialAudioCodecCb.SelectedItem).Value; config.ClipsBookmarksFileFormat = (Configuration.ClipBookmarkFormat)clipsBookmarksFormatCb.SelectedItem; config.RetainAaxFile = retainAaxFileCbox.Checked; @@ -140,7 +147,6 @@ namespace LibationWinForms.Dialogs config.ChapterTitleTemplate = chapterTitleTemplateTb.Text; } - private void downloadClipsBookmarksCbox_CheckedChanged(object sender, EventArgs e) { clipsBookmarksFormatCb.Enabled = downloadClipsBookmarksCbox.Checked; @@ -190,27 +196,28 @@ namespace LibationWinForms.Dialogs } } - private void fileDownloadQualityCb_SelectedIndexChanged(object sender, EventArgs e) - { - var selectedSpatial = fileDownloadQualityCb.SelectedItem.Equals(Configuration.DownloadQuality.Spatial); - if (selectedSpatial) + + private void useWidevineCbox_CheckedChanged(object sender, EventArgs e) + { + if (useWidevineCbox.Checked) { using var accounts = AudibleApiStorage.GetAccountsSettingsPersister(); if (!accounts.AccountsSettings.Accounts.Any(a => a.IdentityTokens.DeviceType == AudibleApi.Resources.DeviceType)) { MessageBox.Show(this, - "Your must remove account(s) from Libation and then re-add them to enable spatial audiobook downloads.", - "Spatial Audio Unavailable", + "Your must remove account(s) from Libation and then re-add them to enable widwvine content.", + "Widevine Content Unavailable", MessageBoxButtons.OK); - fileDownloadQualityCb.SelectedItem = Configuration.DownloadQuality.High; + useWidevineCbox.Checked = false; return; } } - - spatialCodecLbl.Enabled = spatialAudioCodecCb.Enabled = selectedSpatial; + requestSpatialCbox.Enabled = useWidevineCbox.Checked; + spatialCodecLbl.Enabled = spatialAudioCodecCb.Enabled = useWidevineCbox.Checked && requestSpatialCbox.Checked; } + } } diff --git a/Source/LibationWinForms/Dialogs/SettingsDialog.Designer.cs b/Source/LibationWinForms/Dialogs/SettingsDialog.Designer.cs index 232e37d3..1f8ef5ab 100644 --- a/Source/LibationWinForms/Dialogs/SettingsDialog.Designer.cs +++ b/Source/LibationWinForms/Dialogs/SettingsDialog.Designer.cs @@ -84,6 +84,8 @@ folderTemplateTb = new System.Windows.Forms.TextBox(); folderTemplateLbl = new System.Windows.Forms.Label(); tab4AudioFileOptions = new System.Windows.Forms.TabPage(); + requestSpatialCbox = new System.Windows.Forms.CheckBox(); + useWidevineCbox = new System.Windows.Forms.CheckBox(); spatialAudioCodecCb = new System.Windows.Forms.ComboBox(); spatialCodecLbl = new System.Windows.Forms.Label(); moveMoovAtomCbox = new System.Windows.Forms.CheckBox(); @@ -306,7 +308,7 @@ allowLibationFixupCbox.AutoSize = true; allowLibationFixupCbox.Checked = true; allowLibationFixupCbox.CheckState = System.Windows.Forms.CheckState.Checked; - allowLibationFixupCbox.Location = new System.Drawing.Point(19, 205); + allowLibationFixupCbox.Location = new System.Drawing.Point(19, 230); allowLibationFixupCbox.Name = "allowLibationFixupCbox"; allowLibationFixupCbox.Size = new System.Drawing.Size(162, 19); allowLibationFixupCbox.TabIndex = 11; @@ -772,6 +774,8 @@ // tab4AudioFileOptions // tab4AudioFileOptions.AutoScroll = true; + tab4AudioFileOptions.Controls.Add(requestSpatialCbox); + tab4AudioFileOptions.Controls.Add(useWidevineCbox); tab4AudioFileOptions.Controls.Add(spatialAudioCodecCb); tab4AudioFileOptions.Controls.Add(spatialCodecLbl); tab4AudioFileOptions.Controls.Add(moveMoovAtomCbox); @@ -798,11 +802,38 @@ tab4AudioFileOptions.Text = "Audio File Options"; tab4AudioFileOptions.UseVisualStyleBackColor = true; // + // requestSpatialCbox + // + requestSpatialCbox.AutoSize = true; + requestSpatialCbox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + requestSpatialCbox.Checked = true; + requestSpatialCbox.CheckState = System.Windows.Forms.CheckState.Checked; + requestSpatialCbox.Location = new System.Drawing.Point(284, 35); + requestSpatialCbox.Name = "requestSpatialCbox"; + requestSpatialCbox.Size = new System.Drawing.Size(138, 19); + requestSpatialCbox.TabIndex = 29; + requestSpatialCbox.Text = "[RequestSpatial desc]"; + requestSpatialCbox.UseVisualStyleBackColor = true; + requestSpatialCbox.CheckedChanged += useWidevineCbox_CheckedChanged; + // + // useWidevineCbox + // + useWidevineCbox.AutoSize = true; + useWidevineCbox.Checked = true; + useWidevineCbox.CheckState = System.Windows.Forms.CheckState.Checked; + useWidevineCbox.Location = new System.Drawing.Point(19, 35); + useWidevineCbox.Name = "useWidevineCbox"; + useWidevineCbox.Size = new System.Drawing.Size(129, 19); + useWidevineCbox.TabIndex = 28; + useWidevineCbox.Text = "[UseWidevine desc]"; + useWidevineCbox.UseVisualStyleBackColor = true; + useWidevineCbox.CheckedChanged += useWidevineCbox_CheckedChanged; + // // spatialAudioCodecCb // spatialAudioCodecCb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; spatialAudioCodecCb.FormattingEnabled = true; - spatialAudioCodecCb.Location = new System.Drawing.Point(249, 35); + spatialAudioCodecCb.Location = new System.Drawing.Point(249, 60); spatialAudioCodecCb.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3); spatialAudioCodecCb.Name = "spatialAudioCodecCb"; spatialAudioCodecCb.Size = new System.Drawing.Size(173, 23); @@ -811,7 +842,7 @@ // spatialCodecLbl // spatialCodecLbl.AutoSize = true; - spatialCodecLbl.Location = new System.Drawing.Point(19, 37); + spatialCodecLbl.Location = new System.Drawing.Point(19, 62); spatialCodecLbl.Name = "spatialCodecLbl"; spatialCodecLbl.Size = new System.Drawing.Size(143, 15); spatialCodecLbl.TabIndex = 24; @@ -836,7 +867,6 @@ fileDownloadQualityCb.Name = "fileDownloadQualityCb"; fileDownloadQualityCb.Size = new System.Drawing.Size(130, 23); fileDownloadQualityCb.TabIndex = 1; - fileDownloadQualityCb.SelectedIndexChanged += fileDownloadQualityCb_SelectedIndexChanged; // // fileDownloadQualityLbl // @@ -851,7 +881,7 @@ // combineNestedChapterTitlesCbox // combineNestedChapterTitlesCbox.AutoSize = true; - combineNestedChapterTitlesCbox.Location = new System.Drawing.Point(19, 181); + combineNestedChapterTitlesCbox.Location = new System.Drawing.Point(19, 206); combineNestedChapterTitlesCbox.Name = "combineNestedChapterTitlesCbox"; combineNestedChapterTitlesCbox.Size = new System.Drawing.Size(217, 19); combineNestedChapterTitlesCbox.TabIndex = 10; @@ -862,7 +892,7 @@ // clipsBookmarksFormatCb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; clipsBookmarksFormatCb.FormattingEnabled = true; - clipsBookmarksFormatCb.Location = new System.Drawing.Point(285, 107); + clipsBookmarksFormatCb.Location = new System.Drawing.Point(285, 132); clipsBookmarksFormatCb.Name = "clipsBookmarksFormatCb"; clipsBookmarksFormatCb.Size = new System.Drawing.Size(67, 23); clipsBookmarksFormatCb.TabIndex = 6; @@ -870,7 +900,7 @@ // downloadClipsBookmarksCbox // downloadClipsBookmarksCbox.AutoSize = true; - downloadClipsBookmarksCbox.Location = new System.Drawing.Point(19, 109); + downloadClipsBookmarksCbox.Location = new System.Drawing.Point(19, 134); downloadClipsBookmarksCbox.Name = "downloadClipsBookmarksCbox"; downloadClipsBookmarksCbox.Size = new System.Drawing.Size(248, 19); downloadClipsBookmarksCbox.TabIndex = 5; @@ -883,7 +913,7 @@ audiobookFixupsGb.Controls.Add(splitFilesByChapterCbox); audiobookFixupsGb.Controls.Add(stripUnabridgedCbox); audiobookFixupsGb.Controls.Add(stripAudibleBrandingCbox); - audiobookFixupsGb.Location = new System.Drawing.Point(6, 229); + audiobookFixupsGb.Location = new System.Drawing.Point(6, 254); audiobookFixupsGb.Name = "audiobookFixupsGb"; audiobookFixupsGb.Size = new System.Drawing.Size(416, 114); audiobookFixupsGb.TabIndex = 19; @@ -1324,7 +1354,7 @@ // mergeOpeningEndCreditsCbox // mergeOpeningEndCreditsCbox.AutoSize = true; - mergeOpeningEndCreditsCbox.Location = new System.Drawing.Point(19, 157); + mergeOpeningEndCreditsCbox.Location = new System.Drawing.Point(19, 182); mergeOpeningEndCreditsCbox.Name = "mergeOpeningEndCreditsCbox"; mergeOpeningEndCreditsCbox.Size = new System.Drawing.Size(198, 19); mergeOpeningEndCreditsCbox.TabIndex = 9; @@ -1334,7 +1364,7 @@ // retainAaxFileCbox // retainAaxFileCbox.AutoSize = true; - retainAaxFileCbox.Location = new System.Drawing.Point(19, 133); + retainAaxFileCbox.Location = new System.Drawing.Point(19, 158); retainAaxFileCbox.Name = "retainAaxFileCbox"; retainAaxFileCbox.Size = new System.Drawing.Size(131, 19); retainAaxFileCbox.TabIndex = 8; @@ -1347,7 +1377,7 @@ downloadCoverArtCbox.AutoSize = true; downloadCoverArtCbox.Checked = true; downloadCoverArtCbox.CheckState = System.Windows.Forms.CheckState.Checked; - downloadCoverArtCbox.Location = new System.Drawing.Point(19, 85); + downloadCoverArtCbox.Location = new System.Drawing.Point(19, 110); downloadCoverArtCbox.Name = "downloadCoverArtCbox"; downloadCoverArtCbox.Size = new System.Drawing.Size(162, 19); downloadCoverArtCbox.TabIndex = 4; @@ -1360,7 +1390,7 @@ createCueSheetCbox.AutoSize = true; createCueSheetCbox.Checked = true; createCueSheetCbox.CheckState = System.Windows.Forms.CheckState.Checked; - createCueSheetCbox.Location = new System.Drawing.Point(19, 61); + createCueSheetCbox.Location = new System.Drawing.Point(19, 86); createCueSheetCbox.Name = "createCueSheetCbox"; createCueSheetCbox.Size = new System.Drawing.Size(145, 19); createCueSheetCbox.TabIndex = 3; @@ -1531,5 +1561,7 @@ private System.Windows.Forms.Button applyDisplaySettingsBtn; private System.Windows.Forms.ComboBox spatialAudioCodecCb; private System.Windows.Forms.Label spatialCodecLbl; + private System.Windows.Forms.CheckBox useWidevineCbox; + private System.Windows.Forms.CheckBox requestSpatialCbox; } } \ No newline at end of file