diff --git a/lib/channel/playlist.js b/lib/channel/playlist.js index 0646620d..b27d18cf 100644 --- a/lib/channel/playlist.js +++ b/lib/channel/playlist.js @@ -406,7 +406,7 @@ PlaylistModule.prototype.handleQueue = function (user, data) { title: data.title, link: link, temp: temp, - shouldAddToLibrary: temp, + shouldAddToLibrary: !temp, queueby: queueby, duration: duration, maxlength: maxlength diff --git a/lib/ffmpeg.js b/lib/ffmpeg.js index 9b5fb395..bf4d2329 100644 --- a/lib/ffmpeg.js +++ b/lib/ffmpeg.js @@ -21,7 +21,7 @@ var acceptedCodecs = { "flv/h264": true, "matroska/vp8": true, "matroska/vp9": true, - "ogg/theora": true, + "ogg/theora": true }; var acceptedAudioCodecs = { @@ -29,6 +29,10 @@ var acceptedAudioCodecs = { "vorbis": true }; +var audioOnlyContainers = { + "mp3": true +}; + exports.query = function (filename, cb) { if (!Metadata) { init(); @@ -38,6 +42,11 @@ exports.query = function (filename, cb) { return cb("Raw file playback is not enabled on this server"); } + if (!filename.match(/^https?:\/\//)) { + return cb("Raw file playback is only supported for links accessible via HTTP " + + "or HTTPS"); + } + new Metadata(filename, function (meta, err) { if (err) { return cb(err); @@ -53,7 +62,7 @@ exports.query = function (filename, cb) { var data = { title: meta.title || "Raw Video", - duration: meta.durationsec, + duration: Math.ceil(meta.durationsec), bitrate: video.bitrate, codec: codec }; @@ -69,12 +78,15 @@ exports.query = function (filename, cb) { var data = { title: meta.title || "Raw Audio", - duration: meta.durationsec, + duration: Math.ceil(meta.durationsec), bitrate: audio.bitrate, codec: codec }; cb(null, data); + } else if (data.ffmpegErr.match(/Protocol not found/)) { + return cb("This server is unable to load videos over the " + + filename.split(":")[0] + " protocol."); } else { return cb("Parsed metadata did not contain a valid video or audio stream. " + "Either the file is invalid or it has a format unsupported by " + @@ -84,7 +96,11 @@ exports.query = function (filename, cb) { }; function isVideo(meta) { - return meta.video && meta.video.bitrate > 0 && meta.video.container && meta.video.codec; + return meta.video && + meta.video.bitrate > 0 && + meta.video.container && + meta.video.codec && + !(meta.video.container in audioOnlyContainers); } function isAudio(meta) {