Dailymotion support

This commit is contained in:
calzoneman 2013-03-23 13:17:39 -05:00
parent bf72733086
commit c0fc363f1b
6 changed files with 116 additions and 6 deletions

View file

@ -419,6 +419,25 @@ Channel.prototype.enqueue = function(data) {
InfoGetter.getVIInfo(data.id, callback); InfoGetter.getVIInfo(data.id, callback);
} }
// Dailymotion
else if(data.type == "dm") {
var callback = (function(chan, id) { return function(res, data) {
if(res != 200) {
return;
}
var seconds = data.duration;
var title = data.title;
var vid = new Media(id, title, seconds, "dm");
chan.queue.splice(idx, 0, vid);
chan.sendAll('queue', {
media: vid.pack(),
pos: idx
});
chan.addToLibrary(vid);
}})(this, data.id);
InfoGetter.getDMInfo(data.id, callback);
}
} }
// Removes a media from the play queue // Removes a media from the play queue

View file

@ -7,6 +7,7 @@
*/ */
var http = require('http'); var http = require('http');
var https = require('https');
// Helper function for making an HTTP request and getting the result // Helper function for making an HTTP request and getting the result
// as JSON // as JSON
@ -22,7 +23,30 @@ function getJSON(options, callback) {
var data = JSON.parse(buffer); var data = JSON.parse(buffer);
} }
catch(e) { catch(e) {
console.log("JSON fail: " + options); console.log("JSON fail: ", options);
return;
}
callback(res.statusCode, data);
});
});
req.end();
};
// Dailymotion uses HTTPS for anonymous requests... [](/picard)
function getJSONHTTPS(options, callback) {
var req = https.request(options, function(res){
var buffer = '';
res.setEncoding('utf8');
res.on('data', function (chunk) {
buffer += chunk;
});
res.on('end', function() {
try {
var data = JSON.parse(buffer);
}
catch(e) {
console.log("JSON fail: ", options);
return; return;
} }
callback(res.statusCode, data); callback(res.statusCode, data);
@ -81,3 +105,14 @@ exports.getVIInfo = function(id, callback) {
timeout: 1000}, callback); timeout: 1000}, callback);
} }
// Look up Dailymotion info
exports.getDMInfo = function(id, callback) {
var fields = "duration,title"
getJSONHTTPS({
host: "api.dailymotion.com",
port: 443,
path: "/video/" + id + "?fields=" + fields,
method: "GET",
dataType: "jsonp",
timeout: 1000}, callback);
}

View file

@ -199,6 +199,8 @@ function initCallbacks() {
updateSC(data); updateSC(data);
else if(data.type == "vi") else if(data.type == "vi")
updateVI(data); updateVI(data);
else if(data.type == "dm")
updateDM(data);
}); });
socket.on('userlist', function(data) { socket.on('userlist', function(data) {
@ -245,6 +247,14 @@ function initCallbacks() {
}); });
}); });
} }
else if(MEDIATYPE == "dm") {
socket.emit('mediaUpdate', {
id: PLAYER.mediaId,
seconds: PLAYER.currentTime,
paused: PLAYER.paused,
type: "dm"
});
}
}; };
} }
// I'm not a leader. Don't send syncs to the server // I'm not a leader. Don't send syncs to the server

View file

@ -81,6 +81,15 @@ tag.src = "http://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0]; var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// Load the Dailymotion iframe API
/*
var tag = document.createElement('script');
tag.src = "http://api.dmcdn.net/all.js";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
*/
if(uname != null && pw != null && pw != "false") { if(uname != null && pw != null && pw != "false") {

View file

@ -335,6 +335,32 @@ function updateSC(data) {
}); });
} }
// Dailymotion synchronization
function updateDM(data) {
if(MEDIATYPE != "dm") {
console.log("updateDM: MEDIATYPE=", MEDIATYPE);
removeCurrentPlayer();
PLAYER = DM.player("ytapiplayer", {
video: data.id,
width: 640,
height: 390,
params: {autoplay: 1}
});
PLAYER.mediaId = data.id;
MEDIATYPE = "dm";
}
else if(PLAYER.mediaId != data.id) {
PLAYER.api("load", data.id);
PLAYER.mediaId = data.id;
}
else {
if(Math.abs(data.currentTime - PLAYER.currentTime) > SYNC_THRESHOLD) {
PLAYER.api("seek", data.currentTime);
}
}
}
// Vimeo synchronization // Vimeo synchronization
// URGH building a synchronizing tool is so frustrating when // URGH building a synchronizing tool is so frustrating when
// these APIs are designed to be async // these APIs are designed to be async
@ -408,16 +434,18 @@ function removeCurrentPlayer(){
function parseVideoURL(url){ function parseVideoURL(url){
if(typeof(url) != "string") if(typeof(url) != "string")
return null; return null;
if(url.indexOf("youtu") != -1) if(url.indexOf("youtu.be") != -1 || url.indexOf("youtube.com") != -1)
return [parseYTURL(url), "yt"]; return [parseYTURL(url), "yt"];
else if(url.indexOf("twitch") != -1) else if(url.indexOf("twitch.tv") != -1)
return [parseTwitch(url), "tw"]; return [parseTwitch(url), "tw"];
else if(url.indexOf("livestream") != -1) else if(url.indexOf("livestream.com") != -1)
return [parseLivestream(url), "li"]; return [parseLivestream(url), "li"];
else if(url.indexOf("soundcloud") != -1) else if(url.indexOf("soundcloud.com") != -1)
return [url, "sc"]; return [url, "sc"];
else if(url.indexOf("vimeo") != -1) else if(url.indexOf("vimeo.com") != -1)
return [parseVimeo(url), "vi"]; return [parseVimeo(url), "vi"];
else if(url.indexOf("dailymotion.com") != -1)
return [parseDailymotion(url), "dm"];
} }
function parseYTURL(url) { function parseYTURL(url) {
@ -470,6 +498,14 @@ function parseVimeo(url) {
return null; return null;
} }
function parseDailymotion(url) {
var m = url.match(/dailymotion\.com\/video\/([a-zA-Z0-9_-]+)/);
if(m) {
return m[1];
}
return null;
}
function closePoll() { function closePoll() {
if($('#pollcontainer .active').length != 0) { if($('#pollcontainer .active').length != 0) {
var poll = $('#pollcontainer .active'); var poll = $('#pollcontainer .active');

View file

@ -137,6 +137,7 @@
</div> <!-- /container --> </div> <!-- /container -->
<script src="https://w.soundcloud.com/player/api.js"></script> <script src="https://w.soundcloud.com/player/api.js"></script>
<script src="http://api.dmcdn.net/all.js"></script>
<script src="./assets/js/froogaloop.min.js"></script> <script src="./assets/js/froogaloop.min.js"></script>
<script src="./assets/js/jquery.js"></script> <script src="./assets/js/jquery.js"></script>
<script src="./assets/js/webtoolkit.sha256.js" type="text/javascript"></script> <script src="./assets/js/webtoolkit.sha256.js" type="text/javascript"></script>