feat(audio): add bitrate chip control, default bitrates, and marquee pair
This commit is contained in:
@@ -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 }) {
|
||||||
|
|||||||
@@ -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...",
|
||||||
|
|||||||
@@ -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...",
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user