diff --git a/scripts/clean.ts b/scripts/clean.ts new file mode 100644 index 0000000..90666a1 --- /dev/null +++ b/scripts/clean.ts @@ -0,0 +1,86 @@ +/* + * this is a deno script to clean up the m3u8 files from the music player + * + */ + +import { opendir, readFile, writeFile } from 'node:fs/promises'; +import * as path from "jsr:@std/path"; +import { Dirent } from 'node:fs'; + +/** + * longEnough will be true if splitting the line gave 3+ sections, and false if it's too short + * + * @param cleanLine + * @returns [cleanLine, longEnough] + */ +function replaceLineDashes(cleanLine: string): [string, boolean] { + const spl = cleanLine.split(' - ') + if (spl.length < 3) { + return [spl.join(' // '), false] + } + + const [spl1, spl2, ...splRemain] = spl + const spl3 = splRemain.join(' - ') + + return [[spl1, spl2, spl3].join(' // '), true] +} + +// loop through every line of the file and clean up each line +function cleanFile(dirent: Dirent, content: string): string { + const lines = content.split('\n') + const cleanLines: string[] = [] + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim() + + if (!line || line.startsWith("#")) { + continue + } + + const ext = path.extname(line) + const name = path.basename(line, ext) + + let cleanLine = name + .replace(/ - Single/g, '') + .replace(/- \d+ -/g, '-') + + const [updatedCleanLine, longEnough] = replaceLineDashes(cleanLine) + cleanLine = updatedCleanLine + + if (!longEnough) { + cleanLine = `BAD LINE --- ${cleanLine}` + const fileName = path.basename(dirent.name) + console.log(`Bad Line found in ${fileName} on line ${i+1}: \t${line}`) + } + + cleanLines.push(cleanLine) + } + + return cleanLines.join('\n') + '\n' +} + +// get details from the file, ensure it's a playlist file, then store the updated file contents to a txt file +async function processFile(dirent: Dirent) { + if (dirent.isFile()) { + const ext = path.extname(dirent.name) + const name = path.basename(dirent.name, ext) + const dirname = path.dirname(dirent.name) + const newPath = path.join(dirname, `${name}.txt`) + + if (ext.toUpperCase() === ".M3U8") { + const fileContent = await readFile(dirent.name) + const cleanContent = cleanFile(dirent, fileContent.toString()) + await writeFile(newPath, cleanContent) + } + } +} + +// loop through every file in the current directory +try { + const dir = await opendir('./'); + for await (const dirent of dir) { + await processFile(dirent) + } +} catch (err) { + console.error(err) +}