MystiquePlus/.forgejo/scripts/split-m3u.js
2025-01-30 22:47:58 +00:00

94 lines
No EOL
3.2 KiB
JavaScript

const fs = require('fs');
const path = require('path');
function splitByGroup(filePath) {
const content = fs.readFileSync(filePath, 'utf8');
const lines = content.split('\n');
// Create groups directory if it doesn't exist
const groupsDir = path.join(path.dirname(filePath), 'countries');
if (!fs.existsSync(groupsDir)) {
fs.mkdirSync(groupsDir);
}
// Get existing country files
const existingFiles = fs.readdirSync(groupsDir)
.filter(file => file.endsWith('.m3u'))
.map(file => file.toLowerCase());
const groups = {};
let currentExtinf = null;
// First line should be #EXTM3U
const header = lines[0];
if (!header.startsWith('#EXTM3U')) {
throw new Error('Invalid M3U file: Missing #EXTM3U header');
}
// Process each line
lines.forEach(line => {
line = line.trim();
if (!line) return;
if (line.startsWith('#EXTINF')) {
currentExtinf = line;
const groupMatch = line.match(/group-title="([^"]*)"/);
const groupTitle = groupMatch ? groupMatch[1] : 'Unknown';
if (!groups[groupTitle]) {
groups[groupTitle] = ['#EXTM3U'];
}
groups[groupTitle].push(line);
} else if (currentExtinf && !line.startsWith('#')) {
// This is a URL line
const groupMatch = currentExtinf.match(/group-title="([^"]*)"/);
const groupTitle = groupMatch ? groupMatch[1] : 'Unknown';
groups[groupTitle].push(line);
currentExtinf = null;
}
});
// Get list of current group files that should exist
const currentGroupFiles = Object.keys(groups).map(groupTitle =>
`${groupTitle.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.m3u`
);
// Remove files for groups that no longer exist
existingFiles.forEach(existingFile => {
if (!currentGroupFiles.includes(existingFile)) {
const fileToRemove = path.join(groupsDir, existingFile);
fs.unlinkSync(fileToRemove);
console.log(`Removed obsolete group playlist: ${existingFile}`);
}
});
// Write each group to a separate file
Object.entries(groups).forEach(([groupTitle, groupLines]) => {
const safeGroupTitle = groupTitle.replace(/[^a-z0-9]/gi, '_').toLowerCase();
const groupFilePath = path.join(groupsDir, `${safeGroupTitle}.m3u`);
fs.writeFileSync(groupFilePath, groupLines.join('\n') + '\n');
console.log(`Created/updated group playlist: ${groupFilePath}`);
});
// Create a summary of the split
const summary = Object.entries(groups).map(([group, lines]) => {
const channelCount = (lines.length - 1) / 2; // Subtract header and divide by 2 (EXTINF + URL)
return `${group}: ${channelCount} channels`;
});
console.log('\nPlaylist split summary:');
console.log(summary.join('\n'));
}
const filePath = process.argv[2];
if (!filePath) {
console.error('Please provide the path to mystique.m3u');
process.exit(1);
}
try {
splitByGroup(filePath);
} catch (error) {
console.error('Error splitting mystique.m3u:', error.message);
process.exit(1);
}