diff --git a/lib/index.js b/lib/index.js index 72136d8..467d178 100644 --- a/lib/index.js +++ b/lib/index.js @@ -6,6 +6,7 @@ const config = require('../config'); // Modules const modules = require('./module'); + class FlixInfo { constructor(opt = '') { @@ -14,10 +15,12 @@ class FlixInfo { this.tmdbApiKey = opt; } - getInfo(netflixId, cb) { + + getInfo(netflixId) { // Imdb id page const flixableURL = config.filexibleURL + netflixId; + // The Movie DB api page const theMovieDbURL = config.theMovieDbURL; // API Key @@ -25,101 +28,115 @@ class FlixInfo { // Result Object var returnResult = {}; - request(flixableURL, (err, response, body) => { - if (err) { - returnResult = { error: 1, errorMsg: 'flixable.com connection error' }; - cb(returnResult) - } - else { - const $ = cheerio.load(body, { - normalizeWhitespace: true, - xmlMode: true - }); + return new Promise((resolve, reject) => { - const imdbResult = $('[class="imdbRatingPlugin"]').length; - - if (imdbResult) { - $('[class="imdbRatingPlugin"]').each(function (i, element) { - - // find imdb id attribute and catch - const imdbId = $(this).attr('data-title'); - // create (find) tmdb api url - const tmdbURL = theMovieDbURL + 'find/' + imdbId + '?api_key=' + tmdbApiKey + '&language=en-EN&external_source=imdb_id' - - request(tmdbURL, (err, resultBody, body) => { - // Api find all result (for get tmdb id) - const getJson = JSON.parse(resultBody.body); - if (getJson.status_code > 1) { - // if wrong api key error - returnResult = { error: 1, errorMsg: 'tmdb find id wrong api key error' }; - cb(returnResult) - } - else { - - if (err) { - // if thmdb api connection error - returnResult = { error: 1, errorMsg: 'tmdb find id connection api error' }; - cb(returnResult) - } - else { - - // if tmdb api result not empty - if (getJson.tv_results.length || getJson.movie_results.length) { - - if (getJson.movie_results.length) { - var watchParameter = 'movie'; - var thmdbId = getJson.movie_results[0].id; - } - else if (getJson.tv_results.length) { - var watchParameter = 'tv'; - var thmdbId = getJson.tv_results[0].id; - } - // Get detail info - modules.getDetails(thmdbId, watchParameter, tmdbApiKey, (err, getDetailResult) => { - if (err) { - returnResult = { error: 1, errorMsg: err }; - cb(returnResult); - } - else { - // Get credits info - modules.getCredits(thmdbId, watchParameter, tmdbApiKey, (err, getCreditsResult) => { - if (err) { - returnResult = { error: 1, errorMsg: err }; - cb(returnResult); - } - else { - // Get images info - modules.getImages(thmdbId, watchParameter, tmdbApiKey, (err, getImagesResult) => { - if (err) { - returnResult = { error: 1, errorMsg: err }; - cb(returnResult); - } - else { - returnResult = { result: 1, error: 0, watch: watchParameter, details: getDetailResult, credits: getCreditsResult, images: getImagesResult }; - cb(returnResult); - } - }); - } - }); - } - }); - } - else { - // Return the empty result if tmdb return empty - const returnResult = { result: 0, error: 0, msg: 'tmdb api return is empty'}; - cb(returnResult) - } - } - } - }); - }) + request(flixableURL, (err, response, body) => { + if (err) { + returnResult = { error: 1, errorMsg: 'flixable.com connection error' }; + reject(returnResult); } else { - // Return the empty result if imdb id cannot be found - const returnResult = { result: 0, error: 0, msg: 'imdb id cannot be found' }; - cb(returnResult) + const $ = cheerio.load(body, { + normalizeWhitespace: true, + xmlMode: true + }); + + const imdbResult = $('[class="imdbRatingPlugin"]').length; + let netflixButton = null; + + try { + netflixButton = /class=\"btn btn-primary watch-on-netflix\"(.*?)/img.exec(body)[0]; + } catch (error) { + returnResult = { error: 1, errorMsg: 'this content was not found!' }; + reject(returnResult) + } + + + if (netflixButton != null) { + const imdbId = ($($('[class="imdbRatingPlugin"]')).attr('data-title')); + + if (imdbId) { + // create (find) tmdb api url + const tmdbURL = theMovieDbURL + 'find/' + imdbId + '?api_key=' + tmdbApiKey + '&language=en-EN&external_source=imdb_id' + + request(tmdbURL, (err, resultBody, body) => { + // Api find all result (for get tmdb id) + const getJson = JSON.parse(resultBody.body); + if (getJson.status_code > 1) { + // if wrong api key error + returnResult = { error: 1, errorMsg: 'tmdb find id wrong api key error' }; + reject(returnResult) + } + else { + + if (err) { + // if thmdb api connection error + returnResult = { error: 1, errorMsg: 'tmdb find id connection api error' }; + reject(returnResult) + } + else { + + // if tmdb api result not empty + if (getJson.tv_results.length || getJson.movie_results.length) { + + if (getJson.movie_results.length) { + var watchParameter = 'movie'; + var thmdbId = getJson.movie_results[0].id; + } + else if (getJson.tv_results.length) { + var watchParameter = 'tv'; + var thmdbId = getJson.tv_results[0].id; + } + // Get detail info + modules.getDetails(thmdbId, watchParameter, tmdbApiKey, (err, getDetailResult) => { + if (err) { + returnResult = { error: 1, errorMsg: err }; + reject(returnResult); + } + else { + // Get credits info + modules.getCredits(thmdbId, watchParameter, tmdbApiKey, (err, getCreditsResult) => { + if (err) { + returnResult = { error: 1, errorMsg: err }; + reject(returnResult); + } + else { + // Get images info + modules.getImages(thmdbId, watchParameter, tmdbApiKey, (err, getImagesResult) => { + if (err) { + returnResult = { error: 1, errorMsg: err }; + reject(returnResult); + } + else { + returnResult = { result: 1, error: 0, watch: watchParameter, details: getDetailResult, credits: getCreditsResult, images: getImagesResult }; + resolve(returnResult); + } + }); + } + }); + } + }); + } + else { + // Return the empty result if tmdb return empty + const returnResult = { result: 0, error: 0, msg: 'tmdb api return is empty' }; + reject(returnResult) + } + } + } + }); + } else { + returnResult = { error: 1, errorMsg: 'imdb id not found.' }; + reject(returnResult) + } + } + else { + // Return the empty result if imdb id cannot be found + const returnResult = { result: 0, error: 0, msg: 'imdb id cannot be found' }; + reject(returnResult) + } } - } + }); }); } } diff --git a/lib/module.js b/lib/module.js index cf66389..84bff37 100644 --- a/lib/module.js +++ b/lib/module.js @@ -6,7 +6,7 @@ module.exports.getDetails = function (detailsId, movieOrTv, tmdbApiKey, cb) { if (movieOrTv == 'movie' || movieOrTv == 'tv') { const detailURL = config.theMovieDbURL + movieOrTv + '/' + detailsId + '?api_key=' + tmdbApiKey + '&language=en-US'; - + request(detailURL, (err, resultBody, body) => { const getJson = JSON.parse(resultBody.body); diff --git a/package.json b/package.json index b2bc10f..443a8eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flixinfo", - "version": "1.0.4", + "version": "1.1.0", "description": "Get movie detail with netflix id", "main": "index.js", "directories": { @@ -27,8 +27,9 @@ }, "homepage": "https://github.com/sbilketay/flixinfo#readme", "dependencies": { + "chai-as-promised": "^7.1.1", "cheerio": "^1.0.0-rc.2", - "nodemon": "^1.18.9", + "nodemon": "^1.19.4", "request": "^2.88.0" }, "devDependencies": { diff --git a/test/flixinfo.test.js b/test/flixinfo.test.js index 5f0af52..f211dc0 100644 --- a/test/flixinfo.test.js +++ b/test/flixinfo.test.js @@ -21,69 +21,75 @@ describe('Flix Info', () => { const flixinfoWrongApiKey = new GetFlix('sfs345k34jlkdflgkjdfglk435j345klj'); - flixinfoWrongApiKey.getInfo(70143836, (result) => { - result.should.have.property('error').equal(1); - result.should.have.property('errorMsg').equal('tmdb find id wrong api key error'); - done(); - }); + flixinfoWrongApiKey.getInfo(70143836) + .catch(result => { + result.should.have.property('error').equal(1); + result.should.have.property('errorMsg').equal('tmdb find id wrong api key error'); + done(); + }) + }); }); }); describe('#getInfo()', () => { - const flixinfo = new GetFlix('f29e56ff85f361ff01b5c5403a343021'); + const flixinfo = new GetFlix('d9d6007d1bcf12043db5a085ae3e5bbb'); context('Return result infos', () => { // Movie test it('- movies return right result', (done) => { - flixinfo.getInfo(60033299, (result) => { - result.should.have.property('result').equal(1); - result.should.have.property('error').equal(0); - result.should.have.property('details').have.property('original_title').equal('The Butterfly Effect'); - result.should.have.property('details').have.property('title').equal('The Butterfly Effect'); - result.should.have.property('details').have.property('release_date').equal('2004-01-22'); - result.should.have.property('details').have.property('poster_path').equal('/3PAQy3CyNNJPES772OFMx47lFEE.jpg'); - result.should.have.property('details').have.property('backdrop_path').equal('/zXTUrm0BIrrZn3nEhybg0hlY275.jpg'); - result.should.have.property('details').have.property('id').equal(1954); - result.should.have.property('details').have.property('imdb_id').equal('tt0289879'); - result.should.have.property('details').have.property('original_language').equal('en'); - result.should.have.property('credits').have.property('id').equal(1954); - result.should.have.property('images').have.property('id').equal(1954); - done(); - }); + flixinfo.getInfo(70131314) + .then(result => { + result.should.have.property('result').equal(1); + result.should.have.property('error').equal(0); + result.should.have.property('details').have.property('original_title').equal('Inception'); + result.should.have.property('details').have.property('title').equal('Inception'); + result.should.have.property('details').have.property('release_date').equal('2010-07-15'); + result.should.have.property('details').have.property('poster_path').equal('/qmDpIHrmpJINaRKAfWQfftjCdyi.jpg'); + result.should.have.property('details').have.property('backdrop_path').equal('/s2bT29y0ngXxxu2IA8AOzzXTRhd.jpg'); + result.should.have.property('details').have.property('id').equal(27205); + result.should.have.property('details').have.property('imdb_id').equal('tt1375666'); + result.should.have.property('details').have.property('original_language').equal('en'); + result.should.have.property('credits').have.property('id').equal(27205); + result.should.have.property('images').have.property('id').equal(27205); + done(); + }) }); - // Tv test + // // Tv test it('- tv series return right result', (done) => { - flixinfo.getInfo(80099656, (result) => { - result.should.have.property('result').equal(1); - result.should.have.property('error').equal(0); - result.should.have.property('details').have.property('original_name').equal('Frontier'); - result.should.have.property('details').have.property('name').equal('Frontier'); - result.should.have.property('details').have.property('first_air_date').equal('2016-11-06'); - result.should.have.property('details').have.property('poster_path').equal('/mhIeCeYgG4WJHNzaw2EyRpvmGX8.jpg'); - result.should.have.property('details').have.property('backdrop_path').equal('/hDYEGNX6CADoCqhyBbe2Qu7rKVG.jpg'); - result.should.have.property('details').have.property('id').equal(64555); - result.should.have.property('details').have.property('original_language').equal('en'); - result.should.have.property('credits').have.property('id').equal(64555); - result.should.have.property('images').have.property('id').equal(64555); - done(); - }); + flixinfo.getInfo(80232926) + .then(result => { + result.should.have.property('result').equal(1); + result.should.have.property('error').equal(0); + result.should.have.property('details').have.property('original_name').equal('Ragnarok'); + result.should.have.property('details').have.property('name').equal('Ragnarok'); + result.should.have.property('details').have.property('first_air_date').equal('2020-01-31'); + result.should.have.property('details').have.property('poster_path').equal('/bSXE4qqdWWFF903FmxSdKtVRm7t.jpg'); + result.should.have.property('details').have.property('backdrop_path').equal('/jM7LHr811U4A6EnY9iMyKhUVsMN.jpg'); + result.should.have.property('details').have.property('id').equal(91557); + result.should.have.property('details').have.property('original_language').equal('no'); + result.should.have.property('credits').have.property('id').equal(91557); + result.should.have.property('images').have.property('id').equal(91557); + done(); + }); }); it('- return empty result', (done) => { - flixinfo.getInfo(23424, (result) => { - result.should.have.property('error').equal(0); - done(); - }); + flixinfo.getInfo(70143836) + .then(result => { + result.should.have.property('error').equal(0); + done(); + }); }); it('- flixable.com and tmdb.com connection error', (done) => { nock.disableNetConnect(); //Prevents making request external connection - flixinfo.getInfo(70143836, (result) => { - result.should.have.property('error').equal(1); - result.should.have.property('errorMsg'); - done(); - }); + flixinfo.getInfo(70143836) + .catch(result => { + result.should.have.property('error').equal(1); + result.should.have.property('errorMsg'); + done(); + }); }); }); });