diff --git a/zefie_wtvp_minisrv/includes/ServiceVault/wtv-music/ragen/catchall.js b/zefie_wtvp_minisrv/includes/ServiceVault/wtv-music/ragen/catchall.js new file mode 100644 index 00000000..be87d097 --- /dev/null +++ b/zefie_wtvp_minisrv/includes/ServiceVault/wtv-music/ragen/catchall.js @@ -0,0 +1,83 @@ +const minisrv_service_file = true; + +if (!minisrv_config.services['pnm']) { + throw ("ERROR: pnm service not defined in config!"); +} + + +const pnmVaults = []; +// Check pnm service vault for .ra and .rm files +if (minisrv_config.config.ServiceVaults) { + Object.keys(minisrv_config.config.ServiceVaults).forEach(function (k) { + const service_vault = wtvshared.getAbsolutePath(minisrv_config.config.ServiceVaults[k]); + pnmVaults.push(service_vault + "/pnm"); + }) +} else { + throw ("ERROR: No Service Vaults defined!"); +} + +const url_path = request_headers.request_url.split('?')[0]; +const pathParts = url_path.split('/').filter(p => p); +const serviceName = pathParts.length > 0 ? pathParts[0] : ''; +const remainingPath = '/' + pathParts.slice(1).join('/'); +const filename = remainingPath.split('/').pop().replace('.ram', ''); +const directory = remainingPath.endsWith('/') || !filename ? remainingPath.replace(/\/$/, '') : remainingPath.substring(0, remainingPath.lastIndexOf('/')); + + +let fileFound = false; +const extensions = ['.ra', '.rm']; +let resolvedPath = null; + +// Check if request is for a directory listing (no filename or ends with /) +if (!filename || (request_headers.request_url.endsWith('/') && minisrv_config.services['pnm'].allow_indexing !== false)) { + const listingDir = filename ? directory : directory || '/'; + const allFiles = []; + + for (const pnmVault of pnmVaults) { + const targetDir = path.join(pnmVault, listingDir); + console.log("DEBUG: Listing files in", targetDir); + if (fs.existsSync(targetDir) && fs.statSync(targetDir).isDirectory()) { + const files = fs.readdirSync(targetDir); + files.forEach(file => { + const fullPath = path.join(targetDir, file); + if (fs.statSync(fullPath).isFile() && (file.endsWith('.ra') || file.endsWith('.rm'))) { + const baseFileName = file.substring(0, file.lastIndexOf('.')); + allFiles.push(baseFileName + '.ram'); + } + }); + } + } + + if (allFiles.length > 0) { + headers = `200 OK +Content-type: text/html`; + data = `