diff --git a/src/decrypt-worker/util/audioType.ts b/src/decrypt-worker/util/audioType.ts index 71b1b58..bff53ee 100644 --- a/src/decrypt-worker/util/audioType.ts +++ b/src/decrypt-worker/util/audioType.ts @@ -24,3 +24,17 @@ export function isDataLooksLikeAudio(buffer: Uint8Array): boolean { detectResult.free(); return ok; } + +const AudioMimeType: Record = { + mp3: 'audio/mpeg', + flac: 'audio/flac', + m4a: 'audio/mp4', + ogg: 'audio/ogg', + wma: 'audio/x-ms-wma', + wav: 'audio/x-wav', + dff: 'audio/x-dff', +}; + +export function getMimeTypeFromExt(ext: string) { + return AudioMimeType[ext] || 'application/octet-stream'; +} diff --git a/src/decrypt-worker/util/buffer.ts b/src/decrypt-worker/util/buffer.ts index d7d95cf..b6617c5 100644 --- a/src/decrypt-worker/util/buffer.ts +++ b/src/decrypt-worker/util/buffer.ts @@ -1,7 +1,7 @@ export const toArrayBuffer = async (src: Blob | ArrayBuffer | Uint8Array) => src instanceof Blob ? await src.arrayBuffer() : src; -export const toBlob = (src: Blob | ArrayBuffer | Uint8Array) => - src instanceof Blob ? src : new Blob([src]); +export const toBlob = (src: Blob | ArrayBuffer | Uint8Array, mimeType?: string) => + src instanceof Blob ? src : new Blob([src], { type: mimeType ?? 'application/octet-stream' }); export function* chunkBuffer(buffer: Uint8Array, blockLen = 4096): Generator<[Uint8Array, number], void> { const len = buffer.byteLength; diff --git a/src/decrypt-worker/worker/decrypt.ts b/src/decrypt-worker/worker/decrypt.ts index 7c146c9..1b7ee96 100644 --- a/src/decrypt-worker/worker/decrypt.ts +++ b/src/decrypt-worker/worker/decrypt.ts @@ -6,7 +6,7 @@ import { DecipherFactory, DecipherInstance, Status } from '~/decrypt-worker/Deci import { UnsupportedSourceFile } from '~/decrypt-worker/util/DecryptError.ts'; import { ready as umCryptoReady } from '@unlock-music/crypto'; import { go } from '~/util/go.ts'; -import { detectAudioExtension } from '~/decrypt-worker/util/audioType.ts'; +import { getMimeTypeFromExt, detectAudioExtension } from '~/decrypt-worker/util/audioType.ts'; class DecryptCommandHandler { private readonly label: string; @@ -75,7 +75,7 @@ class DecryptCommandHandler { audioExt = 'm4a'; } - return { decrypted: URL.createObjectURL(toBlob(result.data)), ext: audioExt }; + return { decrypted: URL.createObjectURL(toBlob(result.data, getMimeTypeFromExt(audioExt))), ext: audioExt }; } }