Add explaination of new settings in Application settings page

Add 's' to AudioMultistream variables/methods to stay consistent with yt-dlp's naming of the --audio-multistream flag
This commit is contained in:
Dakota Gravitt 2026-02-26 00:55:13 -06:00
parent 1ba03489ff
commit 4efea375d6
2 changed files with 37 additions and 32 deletions

View File

@ -48,8 +48,8 @@ const ChannelAbout = () => {
const [downloadFormat, setDownloadFormat] = useState<string | null>(null);
const [downloadContainer, setDownloadContainer] = useState<'mp4' | 'mkv' | null>(null);
const [audioMultistream, setAudioMultistream] = useState<boolean | null>(null);
const [audioMultistreamWarning, setAudioMultistreamWarning] = useState<string | null>(null);
const [audioMultistreams, setAudioMultistreams] = useState<boolean | null>(null);
const [audioMultistreamsWarning, setAudioMultistreamsWarning] = useState<string | null>(null);
const [audioLanguages, setAudioLanguages] = useState<string | null>(null);
const [autoDeleteAfter, setAutoDeleteAfter] = useState<number | null>(null);
const [indexPlaylists, setIndexPlaylists] = useState(false);
@ -73,10 +73,10 @@ const ChannelAbout = () => {
setDownloadContainer(
channelResponseData?.channel_overwrites?.download_container ?? null,
);
setAudioMultistream(
setAudioMultistreams(
channelResponseData?.channel_overwrites?.audio_multistream ?? null,
);
setAudioMultistreamWarning(null);
setAudioMultistreamsWarning(null);
setAudioLanguages(channelResponseData?.channel_overwrites?.audio_languages ?? null);
setAutoDeleteAfter(channelResponseData?.channel_overwrites?.autodelete_days ?? null);
setIndexPlaylists(channelResponseData?.channel_overwrites?.index_playlists ?? false);
@ -105,12 +105,12 @@ const ChannelAbout = () => {
if (!channel) return;
const response = await updateChannelOverwrites(channel.channel_id, configKey, configValue);
if (response?.error?.error) {
setAudioMultistreamWarning(response.error.error);
setAudioMultistreamsWarning(response.error.error);
return;
}
setAudioMultistreamWarning(null);
setAudioMultistreamsWarning(null);
if (configKey === 'audio_multistream') {
setAudioMultistream(configValue === null ? null : Boolean(configValue));
setAudioMultistreams(configValue === null ? null : Boolean(configValue));
}
setRefresh(true);
};
@ -322,21 +322,21 @@ const ChannelAbout = () => {
const value = event.target.value as 'mp4' | 'mkv' | '';
if (value === '') {
if (audioMultistream) {
if (audioMultistreams) {
// Always clear channel multistream FIRST when switching to global container.
// This avoids stale global-container state causing persistent override drift.
await handleUpdateConfig('audio_multistream', null);
setAudioMultistream(null);
setAudioMultistreams(null);
}
await handleUpdateConfig('download_container', null);
setDownloadContainer(null);
return;
}
if (value !== 'mkv' && audioMultistream) {
if (value !== 'mkv' && audioMultistreams) {
// Clear multistream first when switching to single-audio container preference.
await handleUpdateConfig('audio_multistream', null);
setAudioMultistream(null);
setAudioMultistreams(null);
}
await handleUpdateConfig('download_container', value);
@ -355,23 +355,23 @@ const ChannelAbout = () => {
</div>
<ToggleConfig
name="audio_multistream"
value={audioMultistream ?? false}
value={audioMultistreams ?? false}
helperText={
audioMultistream
audioMultistreams
? 'If multiple audio tracks are selected/found, Tube Archivist will automatically save as mkv. Single-audio downloads keep the selected/effective container.'
: 'Enable to include multiple audio languages when available for this channel.'
}
updateCallback={handleUpdateConfig}
resetCallback={() => {
handleUpdateConfig('audio_multistream', null);
setAudioMultistream(null);
setAudioMultistreams(null);
}}
/>
{audioMultistreamWarning && (
<p className="settings-error">{audioMultistreamWarning}</p>
{audioMultistreamsWarning && (
<p className="settings-error">{audioMultistreamsWarning}</p>
)}
</div>
{audioMultistream && (
{audioMultistreams && (
<div className="settings-box-wrapper">
<div>
<p>Audio Languages</p>

View File

@ -56,10 +56,10 @@ const SettingsApplication = () => {
const [downloadsFormatSort, setDownloadsFormatSort] = useState<string | null>(null);
const [downloadsExtractorLang, setDownloadsExtractorLang] = useState<string | null>(null);
const [embedMetadata, setEmbedMetadata] = useState(false);
const [audioMultistream, setAudioMultistream] = useState(false);
const [audioMultistreams, setAudioMultistreams] = useState(false);
const [downloadContainer, setDownloadContainer] = useState<'mp4' | 'mkv'>('mp4');
const [audioLanguages, setAudioLanguages] = useState<string | null>(null);
const [audioMultistreamWarning, setAudioMultistreamWarning] = useState<string | null>(null);
const [audioMultistreamsWarning, setAudioMultistreamsWarning] = useState<string | null>(null);
// Subtitles
const [subtitleLang, setSubtitleLang] = useState<string | null>(null);
@ -116,10 +116,10 @@ const SettingsApplication = () => {
setDownloadsFormatSort(appSettingsConfigData?.downloads.format_sort || null);
setDownloadsExtractorLang(appSettingsConfigData?.downloads.extractor_lang || null);
setEmbedMetadata(appSettingsConfigData?.downloads.add_metadata || false);
setAudioMultistream(appSettingsConfigData?.downloads.audio_multistream || false);
setAudioMultistreams(appSettingsConfigData?.downloads.audio_multistream || false);
setAudioLanguages(appSettingsConfigData?.downloads.audio_languages || null);
setDownloadContainer(appSettingsConfigData?.downloads.container || 'mp4');
setAudioMultistreamWarning(null);
setAudioMultistreamsWarning(null);
// Subtitles
setSubtitleLang(appSettingsConfigData?.downloads.subtitle || null);
@ -157,10 +157,10 @@ const SettingsApplication = () => {
const updatedConfig = { [group]: { [key]: configValue } } as Partial<AppSettingsConfigType>;
const response = await updateAppsettingsConfig(updatedConfig);
if (response?.error?.error) {
setAudioMultistreamWarning(response.error.error);
setAudioMultistreamsWarning(response.error.error);
return;
}
setAudioMultistreamWarning(null);
setAudioMultistreamsWarning(null);
setRefresh(true);
};
@ -476,12 +476,17 @@ const SettingsApplication = () => {
</ul>
</li>
<li>
Embedding metadata adds additional metadata and thumbnails directly to the mp4
file.
Download container sets the default file type: mp4 is most browser-friendly,
while mkv is better for multi-audio tracks.
</li>
<li>
Enable multistream audio to download all available audio languages (maps to
<i>--audio-multistream</i>). This can increase file size.
Embedding metadata adds additional metadata and thumbnails directly to mp4
files. Mkv downloads are not embedded by this option.
</li>
<li>
Enable multistream audio to download multiple audio languages (maps to{' '}
<i>--audio-multistreams</i>). This increases file size and may use mkv when
multiple tracks are selected.
</li>
</ul>
</div>
@ -560,19 +565,19 @@ const SettingsApplication = () => {
</div>
<ToggleConfig
name="downloads.audio_multistream"
value={audioMultistream}
value={audioMultistreams}
helperText={
audioMultistream
audioMultistreams
? 'If multiple audio tracks are selected/found, Tube Archivist will automatically save as mkv. Single-audio downloads keep your selected container.'
: 'Enable to include multiple audio languages when available.'
}
updateCallback={handleUpdateConfig}
/>
{audioMultistreamWarning && (
<p className="settings-error">{audioMultistreamWarning}</p>
{audioMultistreamsWarning && (
<p className="settings-error">{audioMultistreamsWarning}</p>
)}
</div>
{audioMultistream && (
{audioMultistreams && (
<div className="settings-box-wrapper">
<div>
<p>Audio languages</p>