diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 429415c8..bbd30e26 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -16,7 +16,7 @@ "all": false, "fs": { "all": true, - "scope": ["$AUDIO/**", "$AUDIO"] + "scope": ["$HOME/**", "$HOME", "$HOME/*"] } }, "bundle": { diff --git a/website/src/repl/FilesTab.jsx b/website/src/repl/FilesTab.jsx index ed8d1215..87b40584 100644 --- a/website/src/repl/FilesTab.jsx +++ b/website/src/repl/FilesTab.jsx @@ -1,59 +1,21 @@ import { Fragment, useEffect } from 'react'; -import { getAudioContext, loadBuffer, processSampleMap } from '@strudel.cycles/webaudio'; import React, { useMemo, useState } from 'react'; - -const TAURI = window.__TAURI__; -const { BaseDirectory, readDir, readBinaryFile, writeTextFile, readTextFile } = TAURI?.fs || {}; - -async function loadFiles() { - return readDir('', { dir: BaseDirectory.Audio, recursive: true }); -} - -const walkFileTree = (node, fn) => { - if (!Array.isArray(node?.children)) { - return; - } - for (const entry of node.children) { - entry.subpath = (node.subpath || []).concat([node.name]); - fn(entry, node); - if (entry.children) { - walkFileTree(entry, fn); - } - } -}; - -const isAudioFile = (filename) => ['wav', 'mp3'].includes(filename.split('.').slice(-1)[0]); -function uint8ArrayToDataURL(uint8Array) { - const blob = new Blob([uint8Array], { type: 'audio/*' }); - const dataURL = URL.createObjectURL(blob); - return dataURL; -} - -const loadCache = {}; // caches local urls to data urls -async function resolveFileURL(url) { - if (loadCache[url]) { - return loadCache[url]; - } - loadCache[url] = (async () => { - const contents = await readBinaryFile(url, { - dir: BaseDirectory.Audio, - }); - return uint8ArrayToDataURL(contents); - })(); - return loadCache[url]; -} +import { isAudioFile, readDir, dir } from './files.mjs'; export function FilesTab() { const [path, setPath] = useState([]); useEffect(() => { let init = false; - loadFiles().then((_tree) => setPath([{ name: 'files', children: _tree, path: BaseDirectory.Audio }])); + readDir('', { dir, recursive: true }) + .then((children) => setPath([{ name: '~/music', children }])) + .catch((err) => { + console.log('error loadin files', err); + }); return () => { init = true; }; }, []); const current = useMemo(() => path[path.length - 1], [path]); - const strudelJson = useMemo(() => current?.children?.find((e) => e.name === 'strudel.json'), [current]); const subpath = useMemo( () => path @@ -63,47 +25,36 @@ export function FilesTab() { [path], ); const folders = useMemo(() => current?.children.filter((e) => !!e.children), [current]); - - const files = useMemo( - () => current?.children.filter((e) => !e.children && isAudioFile(e.name) /* || e.name === 'strudel.json' */), - [current], - ); - const audioFiles = useMemo(() => { - let files = []; - walkFileTree(current, (entry) => { - if (isAudioFile(entry.name)) { - files.push(entry); - } - }); - return files; - }, [current]); + const files = useMemo(() => current?.children.filter((e) => !e.children && isAudioFile(e.name)), [current]); const select = (e) => setPath((p) => p.concat([e])); - return (