2015-04-22 07:50:11 +09:00
|
|
|
getEmbedlyData = function (url) {
|
2015-05-04 10:19:50 +09:00
|
|
|
var data = {};
|
2015-04-22 07:50:11 +09:00
|
|
|
var extractBase = 'http://api.embed.ly/1/extract';
|
2016-04-04 16:50:07 +09:00
|
|
|
var embedlyKey = Telescope.settings.get('embedlyKey');
|
|
|
|
var thumbnailWidth = Telescope.settings.get('thumbnailWidth', 200);
|
|
|
|
var thumbnailHeight = Telescope.settings.get('thumbnailHeight', 125);
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
if(!embedlyKey) {
|
|
|
|
// fail silently to still let the post be submitted as usual
|
|
|
|
console.log("Couldn't find an Embedly API key! Please add it to your Telescope settings or remove the Embedly module.");
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
var result = Meteor.http.get(extractBase, {
|
|
|
|
params: {
|
|
|
|
key: embedlyKey,
|
|
|
|
url: url,
|
|
|
|
image_width: thumbnailWidth,
|
|
|
|
image_height: thumbnailHeight,
|
|
|
|
image_method: 'crop'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// console.log(result)
|
|
|
|
|
|
|
|
if (!!result.data.images && !!result.data.images.length) // there may not always be an image
|
|
|
|
result.data.thumbnailUrl = result.data.images[0].url.replace("http:", ""); // add thumbnailUrl as its own property and remove "http"
|
|
|
|
|
2015-08-24 12:26:20 +09:00
|
|
|
if (result.data.authors && result.data.authors.length > 0) {
|
|
|
|
result.data.sourceName = result.data.authors[0].name;
|
|
|
|
result.data.sourceUrl = result.data.authors[0].url;
|
|
|
|
}
|
|
|
|
|
|
|
|
var embedlyData = _.pick(result.data, 'title', 'media', 'description', 'thumbnailUrl', 'sourceName', 'sourceUrl');
|
|
|
|
|
|
|
|
return embedlyData;
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
console.log(error)
|
|
|
|
// the first 13 characters of the Embedly errors are "failed [400] ", so remove them and parse the rest
|
|
|
|
var errorObject = JSON.parse(error.message.substring(13));
|
|
|
|
throw new Meteor.Error(errorObject.error_code, errorObject.error_message);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-24 12:26:20 +09:00
|
|
|
// For security reason, we make the media property non-modifiable by the client and
|
|
|
|
// we use a separate server-side API call to set it (and the thumbnail object if it hasn't already been set)
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
// Async variant that directly modifies the post object with update()
|
2015-05-04 12:32:00 +09:00
|
|
|
function addMediaAfterSubmit (post) {
|
2015-04-22 07:50:11 +09:00
|
|
|
var set = {};
|
|
|
|
if(post.url){
|
|
|
|
var data = getEmbedlyData(post.url);
|
|
|
|
if (!!data) {
|
|
|
|
// only add a thumbnailUrl if there isn't one already
|
|
|
|
if (!post.thumbnailUrl && !!data.thumbnailUrl) {
|
|
|
|
set.thumbnailUrl = data.thumbnailUrl;
|
|
|
|
}
|
|
|
|
// add media if necessary
|
|
|
|
if (!!data.media.html) {
|
|
|
|
set.media = data.media;
|
|
|
|
}
|
2015-08-24 12:26:20 +09:00
|
|
|
// add source name & url if they exist
|
|
|
|
if (!!data.sourceName && !!data.sourceUrl) {
|
|
|
|
set.sourceName = data.sourceName;
|
|
|
|
set.sourceUrl = data.sourceUrl;
|
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
|
|
|
// make sure set object is not empty (Embedly call could have failed)
|
|
|
|
if(!_.isEmpty(set)) {
|
|
|
|
Posts.update(post._id, {$set: set});
|
|
|
|
}
|
|
|
|
}
|
2015-08-24 12:26:20 +09:00
|
|
|
}
|
2016-02-24 18:23:21 +09:00
|
|
|
Telescope.callbacks.add("posts.new.async", addMediaAfterSubmit);
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-04 10:24:39 +09:00
|
|
|
function updateMediaOnEdit (modifier, post) {
|
|
|
|
var newUrl = modifier.$set.url;
|
|
|
|
if(newUrl && newUrl !== post.url){
|
|
|
|
var data = getEmbedlyData(newUrl);
|
2015-08-24 12:26:20 +09:00
|
|
|
if(!!data) {
|
|
|
|
if (!!data.media.html) {
|
|
|
|
modifier.$set.media = data.media;
|
|
|
|
}
|
|
|
|
|
|
|
|
// add source name & url if they exist
|
|
|
|
if (!!data.sourceName && !!data.sourceUrl) {
|
|
|
|
modifier.$set.sourceName = data.sourceName;
|
|
|
|
modifier.$set.sourceUrl = data.sourceUrl;
|
|
|
|
}
|
2015-05-04 10:19:50 +09:00
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
2015-05-04 10:24:39 +09:00
|
|
|
return modifier;
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
2016-02-24 18:23:21 +09:00
|
|
|
Telescope.callbacks.add("posts.edit.sync", updateMediaOnEdit);
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-10-01 16:13:54 +09:00
|
|
|
var regenerateThumbnail = function (post) {
|
|
|
|
delete post.thumbnailUrl;
|
|
|
|
delete post.media;
|
|
|
|
delete post.sourceName;
|
|
|
|
delete post.sourceUrl;
|
|
|
|
addMediaAfterSubmit(post);
|
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
Meteor.methods({
|
|
|
|
testGetEmbedlyData: function (url) {
|
2015-07-10 11:40:11 +09:00
|
|
|
check(url, String);
|
2015-05-04 10:19:50 +09:00
|
|
|
console.log(getEmbedlyData(url));
|
2015-04-22 07:50:11 +09:00
|
|
|
},
|
|
|
|
getEmbedlyData: function (url) {
|
2015-07-10 11:40:11 +09:00
|
|
|
check(url, String);
|
2015-04-22 07:50:11 +09:00
|
|
|
return getEmbedlyData(url);
|
|
|
|
},
|
|
|
|
embedlyKeyExists: function () {
|
2016-04-04 16:50:07 +09:00
|
|
|
return !!Telescope.settings.get('embedlyKey');
|
2015-04-22 07:50:11 +09:00
|
|
|
},
|
2015-10-01 16:13:54 +09:00
|
|
|
regenerateThumbnail: function (post) {
|
2015-07-10 11:40:11 +09:00
|
|
|
check(post, Posts.simpleSchema());
|
2015-04-22 07:50:11 +09:00
|
|
|
if (Users.can.edit(Meteor.user(), post)) {
|
2015-10-01 16:13:54 +09:00
|
|
|
regenerateThumbnail(post);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
regenerateAllThumbnails: function () {
|
|
|
|
if (Users.is.admin(Meteor.user())) {
|
|
|
|
var posts = Posts.find({thumbnailUrl: {$exists: true}});
|
|
|
|
console.log("// regenerating thumbnails for "+posts.count()+" posts…");
|
|
|
|
posts.forEach(function (post, index) {
|
|
|
|
Meteor.setTimeout(function () {
|
|
|
|
console.log(index+". "+post.title);
|
|
|
|
try {
|
|
|
|
regenerateThumbnail(post);
|
|
|
|
} catch (error) {
|
|
|
|
console.log(error);
|
|
|
|
}
|
|
|
|
}, index * 1000);
|
|
|
|
});
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|