Source

plugins/movies.js

// Modules to install separately
const Xray = require('x-ray');
const cheerio = require('cheerio');
const base64 = require('node-base64-image');
const urlImage = 'https://res.cloudinary.com/drvp1jbjl/image/upload/v1590417729/maxresdefault_plwtyc.jpg';

const escapeRegExp = (string) => {
    return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

const replaceAll = (str, term, replacement) => {
  	return str.replace(new RegExp(escapeRegExp(term), 'g'), replacement);
}

const replaceEspecialCharacter = (str) => {
	var chars={
		"á":"a", "é":"e", "í":"i", "ó":"o", "ú":"u",
		"à":"a", "è":"e", "ì":"i", "ò":"o", "ù":"u",
		"Á":"A", "É":"E", "Í":"I", "Ó":"O", "Ú":"U",
		"À":"A", "È":"E", "Ì":"I", "Ò":"O", "Ù":"U"}
	var expr=/[áàéèíìóòúù]/ig;
	var res=str.replace(expr,function(e){return chars[e]});
	return res;
}

const searchDetail = (in_url) => {
	return new Promise(function(resolve, reject) {
		var xray = Xray();
		var ofertas = [];
        xray(in_url, 'body@html')(function(err, body){
            if (!err){
                var $ = cheerio.load(body);
				let directors = [];
				let actors = [];
				let metadata = {
					url: in_url,
					title: '',
					director: '',
					image: '',
					actors: '',
					year: '',
					duration: '',
					punctuation: '',
					description: ''
				}

				$('#ficha > div > div > div > div.col-md-9.col-md-offset-1.col-xs-12.col-sm-offset-1 > h1').each((index, element) => {
					metadata.title = $(element).text().trim() || '';
				});
				$("span[itemprop='director']").each((index, element) => {
					directors.push($(element).text().trim() || '');
				});
				metadata.director = directors.join(' - ');
				$("meta[itemprop='image']").each((index, element) => {
					metadata.image = $(element).attr('content') || '';
				});
				$("span[itemprop='actor']").each((index, element) => {
					actors.push($(element).text().trim() || '');
				});
				metadata.actors = actors.join(' - ');
				$("meta[itemprop='dateCreated']").each((index, element) => {
					metadata.year = $(element).attr('content') || '';
				});
				let displayDuration = false;
				$('#ficha > div > div > div > div.col-lg-5.col-md-7.col-md-offset-1.col-sm-8.col-sm-offset-1 > div:nth-child(1) > div').each((index, element) => {
					if(displayDuration){
						metadata.duration = $(element).text().trim();
						displayDuration = false;
					}else {
						if (!isNaN($(element).text().trim())){
							displayDuration = true;
						}else {
							displayDuration = false;
						}
					}
				});
				$('div.inforating > div.rating.pull-left').each((index, element) => {
					metadata.punctuation = $(element).data('score') || '';
				});
				$('#ficha > div > div > div > div.col-lg-5.col-md-7.col-md-offset-1.col-sm-8.col-sm-offset-1 > div:nth-child(2)').each((index, element) => {
					metadata.description = $(element).text().trim() || '';
				});

				if (metadata.description !== ''){
					resolve(metadata);
				}else {
					reject('No data found');
				}
            }else {
				reject('Error');
			}
        })
	})
}

const searchMovies = (in_search) => {
	return new Promise(function(resolve, reject) {
		var xray = Xray();
		var movies = [];
		let url = `https://playview.io/search/${ encodeURI(in_search) }`;
        xray(url, 'body@html')(function(err, body){
            if (!err){
                var $ = cheerio.load(body);
				let movieUrl, node;
				$('.container-fluid > .row > .covers').children('.spotlight_container').each((index, element) => {
					node = $(element);
					movieUrl = node.children('a').attr('href');
					if (movieUrl.indexOf('ver-temporadas') === -1){
						movies.push(movieUrl);
					}
				});

				if (movies.length > 0){
					searchDetail(movies[Math.floor(Math.random() * movies.length)])
					.then(movie => {
						resolve(movie);
					})
					.catch(err => {
						reject(err);
					})
				}else {
					reject('No data found');
				}
            }else {
				reject('Error');
			}
        })
	})
}

const defaultConfig = {
    idChat: '',
    photo: '',
    messageError: '*Ooops, an error occurred while transforming the image, please try again later*',
    messageNoDataFound: '*The requested movie could not be found*'
}
/**
 * Plugin that allows you to obtain movies to watch online in different qualities
 * @function movie
 * @memberof Plugins
 * @param {string} idChat - Chat id to send the new image to
 * @param {string} search - Movie to search
 * @param {string} messageError - Message to send in case of error
 * @param {string} messageNoDataFound - Message to send when no movie is found
 */
module.exports = {
    /**
    * Id - Name of the plugin to use
    * @property {string}  id - Name of the plugin to use
    */
    id: 'movie',
    plugin(_args) {
        const _this = this;
        const args = this.mergeOpts(defaultConfig, _args);
        if (args.idChat !== '') {
            if (args.search === '') {
                _this.sendMessage({
                    "idChat": args.idChat, 
                    "message": args.messageNoDataFound
                });
            } else {
                searchMovies(args.search.trim())
                .then(data => {
                    let message = `*-Title:* _${data.title}_ \n`;
                    message += `*-Director:* _${data.director}_ \n`;
                    message += `*-Year:* _${data.year}_ \n`;
                    message += `*-Duration:* _${data.duration}_ \n`;
                    message += `*-Punctuation:* _${data.punctuation} / 5_ \n`;
                    message += `*-Actors:* _${data.actors}_ \n`;
                    message += `*-Description:* _${data.description}_ \n`;

                    let options = {string: true};
                    base64.encode(urlImage, options, function(err, data64){
                        if(!err){
                            _this.sendMessage({
                                "idChat": args.idChat, 
                                "message": message
                            });
                            _this.sendLink({
                                "idChat": args.idChat,
                                "description": data.description,
                                "title": data.title,
                                "thumb": data64,
                                "link": data.url
                            });
                        }else {
                            _this.sendMessage({
                                "idChat": args.idChat, 
                                "message": args.messageError
                            });
                        }
                    })
                })
                .catch(err => {
                    if(err == 'Error'){
                        _this.sendMessage({
                            "idChat": args.idChat, 
                            "message": args.messageError
                        });
                    }else{
                        _this.sendMessage({
                            "idChat": args.idChat, 
                            "message": args.messageNoDataFound
                        });
                    }
                })
            }
        }
    }
};