feat(audio): add bitrate chip control, default bitrates, and marquee pair

This commit is contained in:
2026-08-01 14:22:40 +02:00
parent 3d62d2983b
commit 3775d34a22
5 changed files with 30 additions and 2 deletions
@@ -7,6 +7,8 @@ const QUALITY_FORMATS = ['jpg', 'jpeg', 'webp', 'avif', 'tiff'];
const ICON_SIZES = [16, 32, 48, 256, 512]; const ICON_SIZES = [16, 32, 48, 256, 512];
const DEFAULT_ICON_SIZE = 256; const DEFAULT_ICON_SIZE = 256;
const ARCHIVE_COMPRESSION_FORMATS = ['zip', 'tar.gz', 'tar.bz2', '7z', 'tar.7z']; const ARCHIVE_COMPRESSION_FORMATS = ['zip', 'tar.gz', 'tar.bz2', '7z', 'tar.7z'];
const AUDIO_BITRATE_FORMATS = ['mp3', 'ogg', 'aac', 'm4a'];
const AUDIO_BITRATES = [128, 192, 256, 320];
function rangeProgress(value, min, max) { function rangeProgress(value, min, max) {
return `${((value - min) / (max - min)) * 100}%`; return `${((value - min) / (max - min)) * 100}%`;
@@ -101,6 +103,25 @@ export function FileConfigCard({ item, index, t, onTargetFormatChange, onQuality
/> />
)} )}
{AUDIO_BITRATE_FORMATS.includes(item.targetFormat) && (
<div className="chip-field">
<span>{t('quality.bitrate')}</span>
<div className="chip-group" role="group" aria-label={t('quality.bitrate')}>
{AUDIO_BITRATES.map((bitrate) => (
<button
key={bitrate}
type="button"
className={`chip${item.quality === bitrate ? ' chip-active' : ''}`}
aria-pressed={item.quality === bitrate}
onClick={() => onQualityChange(index, bitrate)}
>
{bitrate}kbps
</button>
))}
</div>
</div>
)}
{item.targetFormat === 'ico' && ( {item.targetFormat === 'ico' && (
<div className="chip-field"> <div className="chip-field">
<span>{t('quality.iconSize')}</span> <span>{t('quality.iconSize')}</span>
@@ -7,6 +7,7 @@ const PAIRS = [
['ttf', 'woff'], ['ttf', 'woff'],
['epub', 'mobi'], ['epub', 'mobi'],
['rar', 'zip'], ['rar', 'zip'],
['wav', 'mp3'],
]; ];
function Pill({ from, to }) { function Pill({ from, to }) {
+2 -1
View File
@@ -22,7 +22,8 @@
"label": "Quality", "label": "Quality",
"compression": "Compression", "compression": "Compression",
"iconSize": "Icon size", "iconSize": "Icon size",
"compressPdf": "Compress as JPEG" "compressPdf": "Compress as JPEG",
"bitrate": "Bitrate"
}, },
"job": { "job": {
"converting": "Converting...", "converting": "Converting...",
+2 -1
View File
@@ -22,7 +22,8 @@
"label": "Qualité", "label": "Qualité",
"compression": "Compression", "compression": "Compression",
"iconSize": "Taille de l'icône", "iconSize": "Taille de l'icône",
"compressPdf": "Compresser en JPEG" "compressPdf": "Compresser en JPEG",
"bitrate": "Bitrate"
}, },
"job": { "job": {
"converting": "Conversion en cours...", "converting": "Conversion en cours...",
+4
View File
@@ -25,6 +25,10 @@ const DEFAULT_QUALITY = {
'tar.bz2': 9, 'tar.bz2': 9,
'7z': 5, '7z': 5,
'tar.7z': 5, 'tar.7z': 5,
mp3: 192,
ogg: 192,
aac: 192,
m4a: 192,
}; };
const DEFAULT_ICON_SIZE = 256; const DEFAULT_ICON_SIZE = 256;