const { configs } = require('apache-api'); const { getStreamsNew } = require('../routes/getStreams') const { getURLandStreams } = require('./getStreamNames') const { allUserCheck } = require('./checker') apache_config = 'tv.k-world' const { exec } = require("child_process"); function restart() { exec("sudo service apache2 reload", (error, stdout, stderr) => { if (error) { console.log(`error: ${error.message}`); return; } if (stderr) { console.log(`stderr: ${stderr}`); return; } console.log(`no issues`); }); } function makeid() { var result = ''; var characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for (var i = 0; i < 5; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } async function get_config() { return await configs.readConfig(apache_config, true, true) } async function split_streams(siteList) { const notUndefined = anyValue => typeof anyValue !== 'undefined' final_array = siteList.map(function (item) { if (item.content.includes('Redirect')) { var cleanString = item.content.replace(/^(.*?)\//g, ""); cleanString = cleanString.split(' ') cleanString[1] = cleanString[1].replace(/"/g, "") return cleanString } }).filter(notUndefined) return final_array } async function updateStream(updatedStreams) { config = await get_config() updatedStreams.forEach(async stream => { config.children[0].children.map(async function (item) { if (item.content.includes(stream[1])) { return item.content = `Redirect 302 /${stream[0]} "${stream[2]}"` } }) try { await configs.saveConfig(apache_config, config, true, true) console.log(stream[0] + ' url updated') } catch (error) { console.log(stream[0] + ' url failed to update') console.log(error) } }) } async function updateStreamCheck(streamsFromKtvDB, streamsFromConfig) { updatedStreams = [] streamsFromConfig.forEach(sfc => { streamsFromKtvDB.forEach(sfktv => { if (sfc[0] == sfktv.stream) { sfc[0] sfktv.stream if (sfc[1] != sfktv.streamURL) { console.log(sfc[0] + ' url changed') updatedStreams.push([sfc[0], sfc[1], sfktv.streamURL]) } else { // console.log(sfc[0] + ' not updated') } } }); }); return updatedStreams } async function checkExists(fullStreamList, mappedStreams) { newstreams = mappedStreams.map(function (s) { return s[1] }) myArray = fullStreamList.filter(function (el) { return newstreams.indexOf(el) < 0; }); if (myArray.length == 0) { console.log('No new streams') } else { console.log('New streams ' + myArray) } return myArray } async function addNewStreams(config, streamList) { streamList.forEach(stream => { config.children[0].children.push({ "tagName": '$rule', "content": `Redirect 302 /${makeid()} "${stream}"` }) }) try { await configs.saveConfig(apache_config, config, true, true) } catch (error) { console.log(error) } } async function syncApache() { // console.log('Updating all user account from ktv') // await allUserCheck() // console.log('Update complete') console.log('Comparing streams from ktv and apache') streams = await getStreamsNew() config = await get_config() streamsFromConfig = await split_streams(config.children[0].children) streamsFromKtvDB = await getURLandStreams() updatedStreams = await updateStreamCheck(streamsFromKtvDB, streamsFromConfig) await updateStream(updatedStreams) console.log('Complete') console.log('Adding any missing streams to apache') streams = await getStreamsNew() config = await get_config() streamsFromConfig = await split_streams(config.children[0].children) missingStreamsInApache = await checkExists(streams, streamsFromConfig) resultOfAddStreams = await addNewStreams(config, missingStreamsInApache) console.log('Complete') console.log('Restarting Apache') await restart() console.log('Complete') } module.exports = { syncApache }