the script i use to clean up m3u8 files
This commit is contained in:
86
scripts/clean.ts
Normal file
86
scripts/clean.ts
Normal file
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user