Browse Source

notifications for displaying status, only one URL/magnet field

master
mortie 7 years ago
parent
commit
c5b1f0b5c8
7 changed files with 86 additions and 27 deletions
  1. 1
    1
      js/fsutil.js
  2. 9
    0
      js/notify.js
  3. 51
    5
      js/play/index.js
  4. 2
    1
      js/play/subtitle-finder.js
  5. 11
    1
      js/play/torrent-streamer.js
  6. 11
    12
      server.js
  7. 1
    7
      web/index.html

+ 1
- 1
js/fsutil.js View File

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



+ 9
- 0
js/notify.js View File

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

+ 51
- 5
js/play/index.js View File

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 = [];

+ 2
- 1
js/play/subtitle-finder.js View File



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

+ 11
- 1
js/play/torrent-streamer.js View File

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;

+ 11
- 12
server.js View File

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;



+ 1
- 7
web/index.html View 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">

Loading…
Cancel
Save