mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-11 05:38:34 +00:00
77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import cowsay from 'cowsay';
|
|
import { createReadStream } from 'fs';
|
|
import { readdir } from 'fs/promises';
|
|
import http from 'http';
|
|
import { join } from 'path';
|
|
|
|
console.log(
|
|
cowsay.say({
|
|
text: 'welcome to @strudel/sampler',
|
|
e: 'oO',
|
|
T: 'U ',
|
|
}),
|
|
);
|
|
|
|
async function getFilesInDirectory(directory) {
|
|
let files = [];
|
|
const dirents = await readdir(directory, { withFileTypes: true });
|
|
for (const dirent of dirents) {
|
|
const fullPath = join(directory, dirent.name);
|
|
if (dirent.isDirectory()) {
|
|
const subFiles = await getFilesInDirectory(fullPath);
|
|
files = files.concat(subFiles);
|
|
} else {
|
|
files.push(fullPath);
|
|
}
|
|
}
|
|
return files;
|
|
}
|
|
|
|
async function getBanks(directory) {
|
|
// const directory = resolve(__dirname, '.');
|
|
let files = await getFilesInDirectory(directory);
|
|
let banks = {};
|
|
files = files
|
|
.filter((f) => ['wav', 'mp3', 'ogg'].includes(f.split('.').slice(-1)[0].toLowerCase()))
|
|
.map((url) => {
|
|
const [bank] = url.split('/').slice(-2);
|
|
banks[bank] = banks[bank] || [];
|
|
url = url.replace(directory, '');
|
|
banks[bank].push(url);
|
|
return url;
|
|
});
|
|
banks._base = `http://localhost:5432`;
|
|
return { banks, files };
|
|
}
|
|
|
|
const server = http.createServer(async (req, res) => {
|
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
// eslint-disable-next-line
|
|
const directory = process.cwd();
|
|
const { banks, files } = await getBanks(directory);
|
|
if (req.url === '/') {
|
|
res.setHeader('Content-Type', 'application/json');
|
|
return res.end(JSON.stringify(banks));
|
|
}
|
|
if (!files.includes(req.url)) {
|
|
res.statusCode = 404;
|
|
res.end('File not found');
|
|
return;
|
|
}
|
|
const filePath = join(directory, req.url);
|
|
const readStream = createReadStream(filePath);
|
|
readStream.on('error', (err) => {
|
|
res.statusCode = 500;
|
|
res.end('Internal server error');
|
|
console.error(err);
|
|
});
|
|
readStream.pipe(res);
|
|
});
|
|
|
|
const port = 5432;
|
|
server.listen(port, () => {
|
|
console.log(`@strudel/sampler is running on http://localhost:${port}`);
|
|
});
|