Update: Video.search + Video.get interests
This commit is contained in:
parent
e0bbe27d2b
commit
b07bb11879
1 changed files with 151 additions and 17 deletions
|
|
@ -4,13 +4,126 @@ const {sendError, sendMessage} = require ("../config/response.config");
|
||||||
const {checkLogin} = require("../config/sessionJWT.config");
|
const {checkLogin} = require("../config/sessionJWT.config");
|
||||||
const {youtube, dailymotion} = require("../config/host.config");
|
const {youtube, dailymotion} = require("../config/host.config");
|
||||||
const VideoCategories = require("../models/objects/video.categories.model");
|
const VideoCategories = require("../models/objects/video.categories.model");
|
||||||
|
const ObjectId = require('mongoose').Types.ObjectId;
|
||||||
const Video = db.videos;
|
const Video = db.videos;
|
||||||
|
|
||||||
|
function asyncRequest(uri, option){
|
||||||
|
return new Promise(function(resolve){
|
||||||
|
request(uri, option,function (error, response, body){
|
||||||
|
resolve({response: response, body: JSON.parse(body)});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function asyncInterest(interest, source){
|
||||||
|
return new Promise(function(resolve){
|
||||||
|
for(const i in VideoCategories){
|
||||||
|
for(const j in VideoCategories[i].categories){
|
||||||
|
if((VideoCategories[i].categories[j].name === interest || VideoCategories[i].categories[j].id === interest)
|
||||||
|
&& VideoCategories[i].categories[j].source === source){
|
||||||
|
resolve(VideoCategories[i].interest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Search Videos
|
// Search Videos
|
||||||
exports.search = (req, res) => {
|
exports.search = async (req, res) => {
|
||||||
const token = checkLogin(req, res);
|
const token = checkLogin(req, res);
|
||||||
if(token){
|
if(token && typeof req.query.q !== 'undefined'){
|
||||||
return sendError(res, 501, -1, "Video.search not Implemented", token);
|
const query = req.query.q;
|
||||||
|
const sources = req.query.sources ? req.query.sources : ["yt", "dm"];
|
||||||
|
const maxResults = req.query.maxResults ? req.query.maxResults : 45;
|
||||||
|
const pageToken = req.query.pageToken ? req.query.pageToken : undefined;
|
||||||
|
|
||||||
|
let yt_results;
|
||||||
|
let dm_results;
|
||||||
|
for(const i in sources){
|
||||||
|
if(sources[i] === youtube.shortname){
|
||||||
|
if(youtube.YOUTUBE_API_KEY !== 'undefined' && youtube.YOUTUBE_API_KEY !== ''){
|
||||||
|
let uri;
|
||||||
|
if(typeof pageToken !== 'undefined'){
|
||||||
|
uri = youtube.baseAPIUrl+'/search'+'?part=snippet&maxResults='+maxResults+'&q='+query+'&pageToken='+pageToken+'&key='+youtube.YOUTUBE_API_KEY;
|
||||||
|
} else{
|
||||||
|
uri = youtube.baseAPIUrl+'/search'+'?part=snippet&maxResults='+maxResults+'&q='+query+'&key='+youtube.YOUTUBE_API_KEY;
|
||||||
|
}
|
||||||
|
const dataIds = await asyncRequest(uri, {});
|
||||||
|
if(dataIds.response.statusCode === 200 && dataIds.body.items.length > 0){
|
||||||
|
let yt_videoIds = "";
|
||||||
|
dataIds.body.items.forEach(item => yt_videoIds = yt_videoIds+item.id.videoId+",");
|
||||||
|
uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&id='+yt_videoIds.slice(0, -1)+'&key='+youtube.YOUTUBE_API_KEY;
|
||||||
|
const dataVideos = await asyncRequest(uri, {});
|
||||||
|
if(dataVideos.response.statusCode === 200 && dataVideos.body.items.length > 0){
|
||||||
|
yt_results = dataVideos.body.items;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else{
|
||||||
|
return sendError(res, 500, -1, `Error Env Variable DAILYMOTION_API_KEY missing, please contact the admin.`, token);
|
||||||
|
}
|
||||||
|
} else if(sources[i] === dailymotion.shortname){
|
||||||
|
if(dailymotion.DAILYMOTION_API_KEY !== 'undefined' && dailymotion.DAILYMOTION_API_KEY !== '') {
|
||||||
|
const uri = dailymotion.baseAPIUrl + '/videos?limit='+maxResults+'&search='+query+'&fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name';
|
||||||
|
const data = await asyncRequest(uri, {});
|
||||||
|
const response = data.response;
|
||||||
|
const jsonBody = data.body;
|
||||||
|
if(response.statusCode === 200){
|
||||||
|
dm_results = jsonBody.list;
|
||||||
|
}
|
||||||
|
} else{
|
||||||
|
return sendError(res, 500, -1, `Error Env Variable DAILYMOTION_API_KEY missing, please contact the admin.`, token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let results = [];
|
||||||
|
for(let i = 0; i < Math.max(dm_results.length, yt_results.length); i++){
|
||||||
|
|
||||||
|
// Youtube
|
||||||
|
if(yt_results.length > i){
|
||||||
|
const yt_data = {
|
||||||
|
videoId: yt_results[i].id,
|
||||||
|
source: youtube.name,
|
||||||
|
imageUrl: yt_results[i].snippet.thumbnails.medium.url ? yt_results[i].snippet.thumbnails.medium.url : null,
|
||||||
|
title: yt_results[i].snippet.title ? yt_results[i].snippet.title : null,
|
||||||
|
channelTitle: yt_results[i].snippet.channelTitle ? yt_results[i].snippet.channelTitle : null,
|
||||||
|
channelUrl: youtube.baseChannelUrl+yt_results[i].snippet.channelId ? yt_results[i].snippet.channelId : null,
|
||||||
|
description: yt_results[i].snippet.description ? yt_results[i].snippet.description : null,
|
||||||
|
embedUrl: 'https://www.youtube.com/embed/'+yt_results[i].id,
|
||||||
|
interest: await asyncInterest(yt_results[i].snippet.categoryId, youtube.name),
|
||||||
|
views: yt_results[i].statistics.viewCount ? parseInt(yt_results[i].statistics.viewCount) : null,
|
||||||
|
likes: yt_results[i].statistics.likeCount ? parseInt(yt_results[i].statistics.likeCount) : null,
|
||||||
|
dislikes: yt_results[i].statistics.dislikeCount ? parseInt(yt_results[i].statistics.dislikeCount) : null,
|
||||||
|
publishedAt: yt_results[i].snippet.publishedAt ? yt_results[i].snippet.publishedAt : null
|
||||||
|
};
|
||||||
|
results.push(yt_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dailymotion
|
||||||
|
if(dm_results.length > i) {
|
||||||
|
const channelTitle = dm_results[i]['owner.username'] ? dm_results[i]['owner.username'] : null;
|
||||||
|
const dm_data = {
|
||||||
|
videoId: dm_results[i].id ? dm_results[i].id : null,
|
||||||
|
source: dailymotion.name,
|
||||||
|
imageUrl: dm_results[i].thumbnail_480_url ? dm_results[i].thumbnail_480_url : null,
|
||||||
|
title: dm_results[i].title ? dm_results[i].title : null,
|
||||||
|
channelTitle: channelTitle.charAt(0).toUpperCase() + channelTitle.slice(1),
|
||||||
|
channelUrl: dailymotion.baseChannelUrl + channelTitle,
|
||||||
|
description: dm_results[i].description ? dm_results[i].description : null,
|
||||||
|
embedUrl: dm_results[i].embed_url ? dm_results[i].embed_url : null,
|
||||||
|
interest: await asyncInterest(dm_results[i]['channel.name'], dailymotion.name),
|
||||||
|
views: dm_results[i].views_total ? parseInt(dm_results[i].views_total) : null,
|
||||||
|
likes: dm_results[i].likes_total ? parseInt(dm_results[i].likes_total) : null,
|
||||||
|
dislikes: null,
|
||||||
|
publishedAt: dm_results[i].created_time ? new Date(dm_results[i].created_time * 1000) : null
|
||||||
|
};
|
||||||
|
results.push(dm_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sendMessage(res, 31, results, token);
|
||||||
|
} else{
|
||||||
|
return sendError(res, 500, -1, `No q given`, token);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -22,7 +135,7 @@ exports.get = (req, res) => {
|
||||||
if(source === youtube.shortname){
|
if(source === youtube.shortname){
|
||||||
if(youtube.YOUTUBE_API_KEY !== 'undefined' && youtube.YOUTUBE_API_KEY !== ''){
|
if(youtube.YOUTUBE_API_KEY !== 'undefined' && youtube.YOUTUBE_API_KEY !== ''){
|
||||||
const uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&id='+id+'&key='+youtube.YOUTUBE_API_KEY;
|
const uri = youtube.baseAPIUrl+'/videos'+'?part=snippet&part=statistics&id='+id+'&key='+youtube.YOUTUBE_API_KEY;
|
||||||
request(uri,{},function (error, response, body){
|
request(uri,{},async function (error, response, body){
|
||||||
if(typeof body !== 'undefined'){
|
if(typeof body !== 'undefined'){
|
||||||
const jsonBody = JSON.parse(body);
|
const jsonBody = JSON.parse(body);
|
||||||
if(jsonBody.items.length !== 0 &&
|
if(jsonBody.items.length !== 0 &&
|
||||||
|
|
@ -36,9 +149,7 @@ exports.get = (req, res) => {
|
||||||
const description = jsonBody.items[0].snippet.description ? jsonBody.items[0].snippet.description : null;
|
const description = jsonBody.items[0].snippet.description ? jsonBody.items[0].snippet.description : null;
|
||||||
//const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null;
|
//const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null;
|
||||||
const publishedAt = jsonBody.items[0].snippet.publishedAt ? jsonBody.items[0].snippet.publishedAt : null;
|
const publishedAt = jsonBody.items[0].snippet.publishedAt ? jsonBody.items[0].snippet.publishedAt : null;
|
||||||
const interest = jsonBody.items[0].snippet.categoryId ? VideoCategories
|
const interest = jsonBody.items[0].snippet.categoryId ? await asyncInterest(jsonBody.items[0].snippet.categoryId, youtube.name): null;
|
||||||
.filter(obj => Object.values(obj.categories[1])
|
|
||||||
.some(val => val.includes(jsonBody.items[0].snippet.categoryId)))[0].interest : null;
|
|
||||||
const views = jsonBody.items[0].statistics.viewCount ? parseInt(jsonBody.items[0].statistics.viewCount) : null;
|
const views = jsonBody.items[0].statistics.viewCount ? parseInt(jsonBody.items[0].statistics.viewCount) : null;
|
||||||
const likes = jsonBody.items[0].statistics.likeCount ? parseInt(jsonBody.items[0].statistics.likeCount) : null;
|
const likes = jsonBody.items[0].statistics.likeCount ? parseInt(jsonBody.items[0].statistics.likeCount) : null;
|
||||||
const dislikes = jsonBody.items[0].statistics.dislikeCount ? parseInt(jsonBody.items[0].statistics.dislikeCount) : null;
|
const dislikes = jsonBody.items[0].statistics.dislikeCount ? parseInt(jsonBody.items[0].statistics.dislikeCount) : null;
|
||||||
|
|
@ -71,7 +182,7 @@ exports.get = (req, res) => {
|
||||||
} else if(source === dailymotion.shortname){
|
} else if(source === dailymotion.shortname){
|
||||||
if(dailymotion.DAILYMOTION_API_KEY !== 'undefined' && dailymotion.DAILYMOTION_API_KEY !== ''){
|
if(dailymotion.DAILYMOTION_API_KEY !== 'undefined' && dailymotion.DAILYMOTION_API_KEY !== ''){
|
||||||
const uri = dailymotion.baseAPIUrl+'/video/'+id+'?fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name';
|
const uri = dailymotion.baseAPIUrl+'/video/'+id+'?fields=created_time%2Cdescription%2Cthumbnail_480_url%2Clikes_total%2Ctitle%2Cid%2Cembed_url%2Cviews_total%2Cowner.username%2Cowner.id%2Cchannel.name';
|
||||||
request(uri,{},function (error, response, body) {
|
request(uri,{},async function (error, response, body) {
|
||||||
if (typeof body !== 'undefined') {
|
if (typeof body !== 'undefined') {
|
||||||
const jsonBody = JSON.parse(body);
|
const jsonBody = JSON.parse(body);
|
||||||
if(response.statusCode === 200 &&
|
if(response.statusCode === 200 &&
|
||||||
|
|
@ -84,9 +195,7 @@ exports.get = (req, res) => {
|
||||||
const description = jsonBody.description ? jsonBody.description : null;
|
const description = jsonBody.description ? jsonBody.description : null;
|
||||||
const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null;
|
const embedUrl = jsonBody.embed_url ? jsonBody.embed_url : null;
|
||||||
const publishedAt = jsonBody.created_time ? new Date(jsonBody.created_time * 1000) : null;
|
const publishedAt = jsonBody.created_time ? new Date(jsonBody.created_time * 1000) : null;
|
||||||
const interest = jsonBody['channel.name'] ? VideoCategories
|
const interest = jsonBody['channel.name'] ? await asyncInterest(jsonBody['channel.name'], dailymotion.name) : null;
|
||||||
.filter(obj => Object.values(obj.categories[0])
|
|
||||||
.some(val => val.includes(jsonBody['channel.name'])))[0].interest : null;
|
|
||||||
const views = jsonBody.views_total ? parseInt(jsonBody.views_total) : null;
|
const views = jsonBody.views_total ? parseInt(jsonBody.views_total) : null;
|
||||||
const likes = jsonBody.likes_total ? parseInt(jsonBody.likes_total) : null;
|
const likes = jsonBody.likes_total ? parseInt(jsonBody.likes_total) : null;
|
||||||
const dislikes = null;
|
const dislikes = null;
|
||||||
|
|
@ -130,7 +239,7 @@ exports.create = (req, res) => {
|
||||||
typeof req.body.interest !== 'undefined' &&
|
typeof req.body.interest !== 'undefined' &&
|
||||||
typeof req.params.id !== 'undefined'){
|
typeof req.params.id !== 'undefined'){
|
||||||
const id = req.params.id;
|
const id = req.params.id;
|
||||||
Video.exists({userId: token.id, videoId: id, source: req.body.source}, function (err, docs){
|
Video.exists({userId: token.id, videoId: id, source: req.body.source, isActive: true}, function (err, docs){
|
||||||
if(err){
|
if(err){
|
||||||
sendError(res, 500,100,err.message || "Some error occurred while checking if the Video already exists.", token);
|
sendError(res, 500,100,err.message || "Some error occurred while checking if the Video already exists.", token);
|
||||||
} else{
|
} else{
|
||||||
|
|
@ -202,8 +311,25 @@ exports.update = (req, res) => {
|
||||||
// Delete Video with id
|
// Delete Video with id
|
||||||
exports.delete = (req, res) => {
|
exports.delete = (req, res) => {
|
||||||
const token = checkLogin(req, res);
|
const token = checkLogin(req, res);
|
||||||
if(token){
|
if(token && typeof req.params.id !== 'undefined') {
|
||||||
return sendError(res, 501, -1, "Video.delete not Implemented", token);
|
const id = req.params.id;
|
||||||
|
if(id && ObjectId.isValid(id)){
|
||||||
|
Video.updateOne({_id: id, userId: token.id, isActive: true}, {isActive: false}, {useFindAndModify: false})
|
||||||
|
.then(data => {
|
||||||
|
if(data) {
|
||||||
|
return sendMessage(res, 37, {message: `Video ${id} was successfully deleted.`}, token);
|
||||||
|
} else {
|
||||||
|
return sendError(res, 404, 105, `Video not found with id=${id}`, token);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
return sendError(res, 500, 100, err.message || `Some error occurred while deleting the Video with id=${id}`, token);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return sendError(res, 500, -1, `Error id is not valid`, token);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return sendError(res, 500, -1, `No id given`, token);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -211,6 +337,14 @@ exports.delete = (req, res) => {
|
||||||
exports.deleteAll = (req, res) => {
|
exports.deleteAll = (req, res) => {
|
||||||
const token = checkLogin(req, res);
|
const token = checkLogin(req, res);
|
||||||
if(token) {
|
if(token) {
|
||||||
return sendError(res, 501, -1, "Video.deleteAll not Implemented", token);
|
Video.deleteMany({userId: {$eq: token.id}})
|
||||||
|
.then(data => {
|
||||||
|
return sendMessage(res, 38, {
|
||||||
|
message: `${data.deletedCount} Videos were deleted successfully.`
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
return sendError(res, 500, 100, err.message || "Some error occurred while removing all Videos.");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Reference in a new issue