Experiment to rebuild Diffuse using web applets.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: use different method to process blob metadata

+22 -7
+1
deno.lock
··· 21 21 ], 22 22 "packageJson": { 23 23 "dependencies": [ 24 + "npm:98.css@~0.1.21", 24 25 "npm:@jsr/bradenmacdonald__s3-lite-client@0.9", 25 26 "npm:@jsr/std__media-types@^1.1.0", 26 27 "npm:@picocss/pico@^2.1.1",
+21 -7
src/pages/processor/metadata-fetcher/_applet.astro
··· 1 1 <script> 2 2 import { applets } from "@web-applets/sdk"; 3 - import { parseFromTokenizer } from "music-metadata"; 3 + import { parseFromTokenizer, parseWebStream } from "music-metadata"; 4 4 import { contentType } from "@std/media-types"; 5 5 import * as URI from "uri-js"; 6 6 import * as HTTP_TOKENIZER from "@tokenizer/http"; ··· 32 32 33 33 // 🛠️ 34 34 async function musicMetadataTags(urls: Urls, covers: boolean = false): Promise<Extraction> { 35 - const httpClient = new HTTP_TOKENIZER.HttpClient(urls.head, { resolveUrl: false }); 36 - httpClient.resolvedUrl = urls.get; 37 - 38 - const tokenizer = await RANGE_TOKENIZER.tokenizer(httpClient); 39 - const meta = await parseFromTokenizer(tokenizer, { skipCovers: covers }); 40 - 41 35 const uri = URI.parse(urls.get); 42 36 const pathParts = uri.path?.split("/"); 43 37 const filename = pathParts?.[pathParts.length - 1]; 38 + 39 + let meta; 40 + 41 + if (urls.get.startsWith("blob:")) { 42 + const mimeType = filename?.includes(".") 43 + ? contentType(filename.split(".").reverse()[0]) 44 + : undefined; 45 + 46 + const resp = await fetch(urls.get); 47 + const stream = resp.body; 48 + 49 + meta = await parseWebStream(stream, { mimeType }); 50 + } else { 51 + const httpClient = new HTTP_TOKENIZER.HttpClient(urls.head, { resolveUrl: false }); 52 + httpClient.resolvedUrl = urls.get; 53 + 54 + const tokenizer = await RANGE_TOKENIZER.tokenizer(httpClient); 55 + 56 + meta = await parseFromTokenizer(tokenizer, { skipCovers: covers }); 57 + } 44 58 45 59 const stats: TrackStats = { 46 60 duration: meta.format.duration,