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); }