try { | try { | ||||
fs.accessSync(dir, fs.F_OK) | fs.accessSync(dir, fs.F_OK) | ||||
} catch (err) { | } catch (err) { | ||||
console.trace(err); | |||||
console.log(err.toString()); | |||||
return; | return; | ||||
} | } | ||||
var spawn = require("child_process").spawn; | |||||
module.exports = function(name, msg) { | |||||
var args = ["--urgency", "low"]; | |||||
args.push(name); | |||||
if (msg) args.push(msg); | |||||
spawn("notify-send", args); | |||||
} |
var fs = require("fs"); | var fs = require("fs"); | ||||
var http = require("http"); | |||||
var https = require("https"); | |||||
var pathlib = require("path"); | var pathlib = require("path"); | ||||
var urllib = require("url"); | |||||
var fsutil = require("../fsutil"); | var fsutil = require("../fsutil"); | ||||
var notify = require("../notify"); | |||||
var player = require("./player"); | var player = require("./player"); | ||||
var httpStream = require("./http-stream"); | var httpStream = require("./http-stream"); | ||||
var torrentStreamer = require("./torrent-streamer"); | var torrentStreamer = require("./torrent-streamer"); | ||||
exports.playFile = function(path, cb, filename) { | exports.playFile = function(path, cb, filename) { | ||||
filename = filename || pathlib.basename(path); | filename = filename || pathlib.basename(path); | ||||
notify("Playing file", filename); | |||||
// Find file's length | // Find file's length | ||||
fs.stat(path, (err, stat) => { | fs.stat(path, (err, stat) => { | ||||
if (err) { | if (err) { | ||||
// Find subtitles | // Find subtitles | ||||
subtitleFinder.find(stat.size, filename, subFile => { | subtitleFinder.find(stat.size, filename, subFile => { | ||||
exports.cleanupFiles.push(subFile); | |||||
// Play! | // Play! | ||||
player.play(path, subFile, cb); | player.play(path, subFile, cb); | ||||
}); | }); | ||||
} | } | ||||
exports.playUrl = function(path, cb) { | |||||
exports.playUrl = function(url, cb) { | |||||
notify("Playing url...", url); | |||||
// Just play, we won't bother finding subtitles | // Just play, we won't bother finding subtitles | ||||
player.play(path, null, cb); | |||||
player.play(url, null, cb); | |||||
} | } | ||||
exports.playTorrent = function(magnet, cb) { | exports.playTorrent = function(magnet, cb) { | ||||
notify("Playing torrent..."); | |||||
// Stream torrent | // Stream torrent | ||||
torrentStreamer.stream(magnet, (err, filesize, filename) => { | torrentStreamer.stream(magnet, (err, filesize, filename) => { | ||||
if (err) | if (err) | ||||
// Find subtitles | // Find subtitles | ||||
subtitleFinder.find(filesize, filename, subFile => { | subtitleFinder.find(filesize, filename, subFile => { | ||||
exports.cleanupFiles.push(subFile); | |||||
// Play! | // Play! | ||||
notify("Starting playback.", filename); | |||||
player.play(app.getAddress()+httpStream.httpPath, subFile, cb); | player.play(app.getAddress()+httpStream.httpPath, subFile, cb); | ||||
}); | }); | ||||
}); | }); | ||||
} | } | ||||
exports.playTorrentPage = function(url, cb) { | |||||
function findMagnet(str) { | |||||
var rx = /['"](magnet:[^'"]+)['"]/; | |||||
var match = str.match(rx); | |||||
if (!match) | |||||
return null; | |||||
return match[1]; | |||||
} | |||||
notify("Finding magnet on torrent page...", url); | |||||
var urlobj = urllib.parse(url); | |||||
var o = urlobj.protocol === "https:" ? https : http; | |||||
o.request(urlobj, res => { | |||||
var str = ""; | |||||
res | |||||
.on("data", d => str += d ) | |||||
.on("error", err => { | |||||
notify("Error downloading page!", err.toString()); | |||||
console.trace(err); | |||||
cb(); | |||||
}) | |||||
.on("end", () => { | |||||
var magnet = findMagnet(str); | |||||
if (!magnet) { | |||||
notify("No magnet link on page!"); | |||||
cb(); | |||||
return; | |||||
} | |||||
exports.playTorrent(magnet, cb); | |||||
}); | |||||
}).end(); | |||||
} | |||||
exports.isPlaying = player.isPlaying; | exports.isPlaying = player.isPlaying; | ||||
player.onstop = function() { | player.onstop = function() { | ||||
try { | try { | ||||
fs.unlink(f, err => { if (err) console.trace(err) }); | fs.unlink(f, err => { if (err) console.trace(err) }); | ||||
} catch (err) { | } catch (err) { | ||||
console.trace(err); | |||||
console.log(err.toString()); | |||||
} | } | ||||
}); | }); | ||||
exports.cleanupFiles = []; | exports.cleanupFiles = []; |
res | res | ||||
.on("error", err => { | .on("error", err => { | ||||
notify("Error finding subtitles", err.toString()); | |||||
console.trace(err); | console.trace(err); | ||||
cb(); | cb(); | ||||
}) | }) | ||||
.on("end", () => { | .on("end", () => { | ||||
ws.close(); | ws.close(); | ||||
cb(subFile); | |||||
setTimeout(() => cb(subFile), 500); | |||||
}); | }); | ||||
}).end(); | }).end(); | ||||
}); | }); |
var httpStream = require("./http-stream"); | var httpStream = require("./http-stream"); | ||||
var torrentStream = require("torrent-stream"); | var torrentStream = require("torrent-stream"); | ||||
var mediarx = /\.(mp4|mkv|mov|avi|ogv)$/; | |||||
var mediaformats = [ | |||||
"webm", "mkv", "flv", "vob", "avi", "mov","wmv", "you", | |||||
"asf", "mp4", "m4p", "m4v", "svi", "ogv", "ogg" | |||||
] | |||||
var rxstr = | |||||
"\\.("+ | |||||
mediaformats.join("|")+ | |||||
")$"; | |||||
var mediarx = new RegExp(rxstr, "i"); | |||||
var engine; | var engine; | ||||
var conf; | var conf; |
var fs = require("fs"); | var fs = require("fs"); | ||||
var pathlib = require("path"); | var pathlib = require("path"); | ||||
var web = require("webstuff"); | var web = require("webstuff"); | ||||
var notify = require("./js/notify"); | |||||
var play = require("./js/play"); | var play = require("./js/play"); | ||||
var fsutil = require("./js/fsutil"); | var fsutil = require("./js/fsutil"); | ||||
if (!fields.url) | if (!fields.url) | ||||
return res.redirect("/"); | return res.redirect("/"); | ||||
play.playUrl(fields.url, () => { | |||||
function cb() { | |||||
res.redirect(play.httpPath); | res.redirect(play.httpPath); | ||||
}); | |||||
}); | |||||
}); | |||||
app.post("/play/magnet", (req, res) => { | |||||
req.parseBody((err, fields) => { | |||||
if (!fields.magnet) | |||||
return res.redirect("/"); | |||||
} | |||||
play.playTorrent(fields.magnet, () => { | |||||
res.redirect(play.httpPath); | |||||
}); | |||||
if (fields.url.indexOf("magnet:") === 0) { | |||||
play.playTorrent(fields.url, cb); | |||||
} else if (fields.url.indexOf("/torrent") !== -1) { | |||||
play.playTorrentPage(fields.url, cb); | |||||
} else { | |||||
play.playUrl(fields.url, cb); | |||||
} | |||||
}); | }); | ||||
}); | }); | ||||
app.post("/play/file", (req, res) => { | app.post("/play/file", (req, res) => { | ||||
notify("Receiving file..."); | |||||
req.parseBody((err, fields, files) => { | req.parseBody((err, fields, files) => { | ||||
var file = files.file; | var file = files.file; | ||||
<body> | <body> | ||||
<div id="parts"> | <div id="parts"> | ||||
<form class="part" method="post" action="/play/url"> | <form class="part" method="post" action="/play/url"> | ||||
<div class="name">URL:</div> | |||||
<div class="name">URL or Magnet Link:</div> | |||||
<input type="url" name="url" autocomplete="off"> | <input type="url" name="url" autocomplete="off"> | ||||
<button>Play</button> | <button>Play</button> | ||||
</form> | </form> | ||||
<form class="part" method="post" action="/play/magnet"> | |||||
<div class="name">Magnet Link:</div> | |||||
<input type="url" name="magnet" autocomplete="off"> | |||||
<button>Play</button> | |||||
</form> | |||||
<form class="part" method="post" enctype="multipart/form-data" action="/play/file"> | <form class="part" method="post" enctype="multipart/form-data" action="/play/file"> | ||||
<div class="name">File:</div> | <div class="name">File:</div> | ||||
<input type="file" name="file" autocomplete="off"> | <input type="file" name="file" autocomplete="off"> |