From e889f0bd28cecfddaf9fef698441e0cf20bc64ba Mon Sep 17 00:00:00 2001 From: florian <> Date: Sun, 31 Mar 2024 00:57:04 +0100 Subject: [PATCH] feat: added support for id3 tags --- bun.lockb | Bin 164115 -> 164453 bytes package.json | 1 + src/components/BlobList/BlobList.tsx | 69 +++++++++++++++++++++++---- src/main.tsx | 3 +- src/utils/useServers.ts | 2 +- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/bun.lockb b/bun.lockb index f812d5793ec7ca1b30aedc091fec50f6bf71030a..95d4de7bb461bdb9cde2381e0d1cf2d034d339e5 100755 GIT binary patch delta 23336 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 delta 23271 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 { const [mode, setMode] = useState('list'); + const [audioFiles, setAudioFiles] = useState([]); const images = useMemo( () => blobs.filter(b => b.type?.startsWith('image/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending @@ -34,10 +39,36 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => { [blobs] ); - const audio = useMemo( - () => blobs.filter(b => b.type?.startsWith('audio/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending - [blobs] - ); + const fetchId3Tags = async (audioFiles: AudioBlob[]) => { + const id3Tags = await Promise.all(audioFiles.map(af => id3.fromUrl(af.url))); + + const filesWithTags = audioFiles.map((af, i) => ({ ...af, id3: id3Tags[i] || undefined })); + + for (const af of filesWithTags) { + if (af.id3 && af.id3.kind == 'v2') { + const id3v2 = af.id3 as ID3TagV2; + if (id3v2.images[0].data) { + const base64data = btoa( + new Uint8Array(id3v2.images[0].data).reduce(function (data, byte) { + return data + String.fromCharCode(byte); + }, '') + ); + af.imageData = `data:${id3v2.images[0].type};base64,${base64data}`; + } + } + } + + setAudioFiles(filesWithTags); + return; + }; + + useEffect(() => { + const audioFiles = blobs.filter(b => b.type?.startsWith('audio/')).sort((a, b) => (a.created > b.created ? -1 : 1)); + + setAudioFiles(audioFiles); + + fetchId3Tags(audioFiles); + }, [blobs]); const docs = useMemo( () => blobs.filter(b => b.type?.startsWith('application/pdf')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending @@ -50,7 +81,7 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => { if (videos.length == 0) setMode('list'); break; case 'audio': - if (audio.length == 0) setMode('list'); + if (audioFiles.length == 0) setMode('list'); break; case 'gallery': if (images.length == 0) setMode('list'); @@ -59,7 +90,7 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => { if (docs.length == 0) setMode('list'); break; } - }, [videos, images, audio, mode, docs]); + }, [videos, images, audioFiles, mode, docs]); const Actions = ({ blob, className }: { blob: BlobDescriptor; className?: string }) => (
@@ -101,7 +132,7 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => {