diff --git a/server/acestream.js b/server/acestream.js old mode 100644 new mode 100755 index 9575df1..fba692a --- a/server/acestream.js +++ b/server/acestream.js @@ -2,6 +2,7 @@ const needle = require('needle') const fs = require('fs') const path = require('path') +const _ = require('lodash') const rimraf = require('rimraf') @@ -14,6 +15,9 @@ const downloader = require('./utils/downloadPackage') const hlsLink = require('./utils/live-trans') +// general timeout of 2 mins +const mins2 = 2 * 60 * 1000 + let acestreamUsed = false const streams = {} @@ -35,6 +39,9 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis acestreamUsed = true + if (playlistCb) + playlistCb = _.once(playlistCb) + // for linux compatibility if (requestHost) requestHost = requestHost.replace('/localhost:', '/127.0.0.1:') @@ -45,7 +52,7 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis // does not need transcoding - let newM3U = "#EXTM3U"; + let newM3U = "#EXTM3U" const altHost = 'http://127.0.0.1:' + peerflixProxy @@ -81,6 +88,7 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis } return } + retries[torrentHash] = 3 streams[torrentHash] = { utime: Date.now(), @@ -94,7 +102,7 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis const productKey = atob('bjUxTHZRb1RsSnpOR2FGeHNlUkstdXZudlgtc0Q0Vm01QXh3bWM0VWNvRC1qcnV4bUtzdUphSDBlVmdF') - const net = require('net'); + const net = require('net') const sha1 = require('sha1') @@ -108,14 +116,37 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis }) const messageCb = function(msg) { -// console.log(msg) streams[torrentHash].status = msg + if (playlistCb && msg.toLowerCase().includes('error:')) { + // just end the playlist request in case of errors + stopTimeOut() + closeAce(msg) + } } let ready = false let lastPrebuf = -1 let lastBuf = -1 + let closeAce = msg => { + if (playlistCb) + playlistCb(false, msg || 'Unknown Error') + ace.close(torrentHash, () => {}) + } + + closeAce = _.once(closeAce) + + let timedOutTimer = setTimeout(() => { + closeAce('Timed out') + }, mins2) + + function stopTimeOut() { + if (timedOutTimer) { + clearTimeout(timedOutTimer) + timedOutTimer = false + } + } + // for debuging: // socket.writeTo = socket.write @@ -129,6 +160,7 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis if (line.startsWith("EVENT livepos")) { ready = true + stopTimeOut() const lastTime = parseInt(line.split(" ")[2].split("=")[1]) const firstTime = parseInt(line.split(" ")[3].split("=")[1]) @@ -165,6 +197,7 @@ const connect = async (torrentHash, serverPort, peerflixProxy, reqToken, playlis const startLink = tData.split(" ")[1] if (ready || (!ready && (startLink.includes('/hls/') || startLink.includes('/content/')))) { ready = true + stopTimeOut() // const streamLink = tData.split(" ")[1] const streamLink = (requestHost || ('http://127.0.0.1:' + peerflixProxy)) + '/ace/' + streams[torrentHash].pid + '/0?token=' + reqToken streams[torrentHash].directLink = streamLink @@ -590,58 +623,15 @@ const ace = { }, binary: { - run: (cb) => { - - // const tryHack = () => { - // triedHack = true - // const wineLoc = path.join(downloadLoc, 'acestream/Contents/MacOS/startwine') - // fs.readFile(wineLoc, (err, data) => { - // if (err || !data) { - // cb(false, code) - // } else { - // const wineLines = data.toString().split('\n') - - // wineLines.splice(2, 0, '#') - - // fs.writeFile(wineLoc, wineLines.join('\n'), (err) => { - // if (err) { - // cb(false, code) - // } else { - // const plistLoc = path.join(downloadLoc, 'acestream/Contents/Info.plist') - // fs.readFile(plistLoc, (err, data) => { - // if (err || !data) { - // cb(false, code) - // } else { - // const lines = data.toString().split('\n') - // const randomNumber = Math.floor(Math.random() * 100) - // lines.forEach((line, ij) => { - // if (line.includes('com.aceengine.powderweb_dep')) { - // lines[ij] = ' com.aceengine.powderweb_dep'+randomNumber+'' - // } else if (line.includes('aceenginepowderweb')) { - // lines[ij] = ' aceenginepowderweb'+randomNumber+'' - // } - // }) - - // fs.writeFile(plistLoc, lines.join('\n'), (err) => { - // if (err) { - // cb(false, code) - // } else { - // triedHack = true - // ace.binary.run(cb) - // } - // }) - // } - // }) - // } - // }) - // } - // }) - // } - - // if (!triedHack) { - // tryHack() - // return - // } + run: (cb, totalTime) => { + + cb = _.once(cb) + + if (totalTime > mins2) { + // timed out + cb(false) + return + } const afterKill = () => { let binaryLoc @@ -679,6 +669,8 @@ const ace = { let noError = true + let findAcePortTimer + if (process.platform != 'linux') { const startRunTime = Date.now() const findAcePort = () => { @@ -688,7 +680,7 @@ const ace = { if (Date.now() - startRunTime > 180000) { cb(false) // 3 min timeout } else { - setTimeout(findAcePort, 2000) + findAcePortTimer = setTimeout(findAcePort, 2000) } } else { cb(true) @@ -696,7 +688,7 @@ const ace = { }) } } - setTimeout(findAcePort, 3000) + findAcePortTimer = setTimeout(findAcePort, 3000) } @@ -713,6 +705,9 @@ const ace = { console.warn("[ace close]", code, signal) + if (findAcePortTimer) + clearTimeout(findAcePortTimer) + aceProcess = null if (process.platform == 'linux') { @@ -720,7 +715,7 @@ const ace = { linuxPort = false } else if (process.platform === "darwin" && code === 0 && Date.now() - startTime < 15000) { console.warn("[ace restart]") - ace.binary.run(cb) + ace.binary.run(cb, (totalTime || 0) + startTime) } else if (process.platform != 'linux') { if (process.platform === "darwin" && code === 2 && !triedHack) { triedHack = true @@ -757,7 +752,7 @@ const ace = { cb(false, code) } else { triedHack = true - ace.binary.run(cb) + ace.binary.run(cb, (totalTime || 0) + startTime) } }) }