big change in the results returned by the api

This commit is contained in:
Wise Colt
2020-04-29 13:36:31 +03:00
parent 87b8350376
commit fd58d43568
5 changed files with 247 additions and 301 deletions

3
.gitignore vendored
View File

@@ -9,4 +9,5 @@ public/src/thumbs
.Spotlight-V100 .Spotlight-V100
.Trashes .Trashes
ehthumbs.db ehthumbs.db
Thumbs.db Thumbs.db
.vscode/

View File

@@ -1,12 +1,10 @@
const GetFlix = require('../index'); const GetFlix = require('../index');
const getflix = new GetFlix('d9d6007d1bcf12043db5a085ae3e5bbb'); const getflix = new GetFlix('d9d6007d1bcf12043db5a085ae3e5bbb');
const getInfo = async () => {
try {
const info = await getflix.getNetflixInfo(81159258);
// const info = await getflix.get(80241239, 'en-EN', 'tr');
console.log(info);
getInfo = async () => {
try {
const info = await getflix.getNetflixInfo(81082225, 'en-EN', 'en');
console.log(info);
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }

View File

@@ -6,41 +6,48 @@ const config = require('../config');
// Modules // Modules
const modules = require('./module'); const modules = require('./module');
class FlixInfo { process.setMaxListeners(0)
constructor(opt = '') { // imdb.com adresine bağlanarak imdb id'sinin geçerliliğini sorgulamayı sağlayan method
if (opt == '') throw new Error('missing tmdb api key'); const imdbIdReal = async (flixableFindImdbId) => {
this.tmdbApiKey = opt; const imdbIdURL = "https://www.imdb.com/title/" + flixableFindImdbId
}
getNetflixInfo(netflixId) {
const flixableUrl = config.filexibleTrURL + netflixId
return new Promise((resolve, reject) => {
request(flixableUrl, (error, response, body) => {
return new Promise((resolve, reject) => {
request(imdbIdURL, (error, response, body) => {
if (error) {
reject('imdb id alinirken hata olustu')
} else {
const $ = cheerio.load(body, { const $ = cheerio.load(body, {
normalizeWhitespace: true, normalizeWhitespace: true,
xmlMode: true xmlMode: true
}); });
const imdbId = ($($('[property="pageId"]')).attr('content'));
const findImdb = ($($('[class="mb-2 rating-container"]')).attr()) ? ($($('[class="imdbRatingPlugin"]')).attr('data-title')) : null; const imdbRate = /<span itemprop="ratingValue">(.*?)<\/span>/img.exec(body)[1]
if (imdbId == undefined) {
if (findImdb) { reject('imdb id bulunamadi')
request(("https://www.imdb.com/title/" + findImdb), (error, response, body) => { } else {
const $ = cheerio.load(body, { resolve({
normalizeWhitespace: true, id: imdbId,
xmlMode: true rate: imdbRate
});
const imdbCleanId = ($($('[property="pageId"]')).attr('content'));
console.log(imdbCleanId);
}) })
} }
}) }
}) })
})
}
class FlixInfo {
/**
* Get movie/show info
* @param {string} tmdbApiKey The Movie DB Api ye ait key girilir
* @description Netflix içeriğine ulaşmayı sağlayan sınıf
*/
constructor(opt = '') {
if (opt == '') throw new Error('missing tmdb api key');
this.tmdbApiKey = opt;
} }
/** /**
@@ -49,161 +56,216 @@ class FlixInfo {
* @param {string} theMovieDbLanguage The Movie DB Api de hangi dilde arama yapılacağı girilir (e.g. tr-TR) * @param {string} theMovieDbLanguage The Movie DB Api de hangi dilde arama yapılacağı girilir (e.g. tr-TR)
* @param {string} netflixLocation flixinfo üzerinde hangi lokasyonda sorgulama yapılacağı girilir (e.g. tr -> tr.flixinfo.com) * @param {string} netflixLocation flixinfo üzerinde hangi lokasyonda sorgulama yapılacağı girilir (e.g. tr -> tr.flixinfo.com)
* @description Netflix içeriğinde id bilgisine ve netflix lokasyonuna göre arama yapmayı sağlar * @description Netflix içeriğinde id bilgisine ve netflix lokasyonuna göre arama yapmayı sağlar
* @return {JSON}
*/ */
get(netflixId, theMovieDbLanguage, netflixLocation) { getNetflixInfo(netflixId, theMovieDbLanguage, netflixLocation) {
// Imdb id page // Imdb id page
const flixableURL = netflixLocation == 'tr' ? (config.filexibleTrURL + netflixId) : (config.filexibleGlobalURL + netflixId); const flixableURL = netflixLocation == 'tr' ? (config.filexibleTrURL + netflixId) : (config.filexibleGlobalURL + netflixId);
// The Movie DB api page // The Movie DB api page
const theMovieDbURL = config.theMovieDbURL; const theMovieDbURL = config.theMovieDbURL;
// API Key // API Key
const tmdbApiKey = this.tmdbApiKey; const tmdbApiKey = this.tmdbApiKey;
// Result Object // Result Object
var returnResult = {}; let returnResult = {};
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request(flixableURL, (err, response, body) => { request(encodeURI(flixableURL), async (err, response, body) => {
if (err) { if (err) {
returnResult = { error: 1, errorMsg: 'flixable.com connection error' }; reject('flixable.com connection error: ' + err.message);
reject(returnResult);
} }
else { else {
const $ = cheerio.load(body, { if (body) {
normalizeWhitespace: true, const $ = cheerio.load(body, {
xmlMode: true normalizeWhitespace: true,
}); xmlMode: true
});
let netflixButton = null;
let netflixButton = null; try {
// netflix butonu varsa içerik bulunuyordur.
netflixButton = /class=\"btn btn-danger btn-block watch-on-service\"(.*?)/img.exec(body)[0];
} catch (error) {
reject('this content was not found!')
}
try { if (netflixButton != null) {
netflixButton = /class=\"btn btn-danger btn-block watch-on-service\"(.*?)/img.exec(body)[0];
} catch (error) {
returnResult = { error: 1, errorMsg: 'this content was not found!' };
reject(returnResult)
}
let imdbId = null
if (netflixButton != null) { let imdbRate = null
let netflixSeasonNumber = null
let netflixRuntime = null
const findImdb = ($($('[class="mb-2 rating-container"]')).attr()); let tmdbURL, netflixTitle
const type = netflixLocation == 'tr' ? (body.search("Sezon") > 0 ? 'tv' : 'movie') : (body.search("Season") > 0 ? 'tv' : 'movie'); // flixable'da bulunan imdb id (bu id değişmiş olabileceğinden imdb.com üzerinden kontrol ediliyor)
const netflixOverview = ($($('[name="description"]')).attr('content')); const findFlixableImdbId = ($($('[class="mb-2 rating-container"]')).attr()) ? ($($('[class="imdbRatingPlugin"]')).attr('data-title')) : null;
const netflixPoster = ($($('[class="img lazyload poster"]')).attr('data-src')); // media type (movie or tv show)
let tmdbURL const type = netflixLocation == 'tr' ? (body.search("Sezon") > 0 ? 'tv' : 'movie') : (body.search("Season") > 0 ? 'tv' : 'movie');
let title // netflix üzerindeki overview bilgisi
const netflixOverview = ($($('[name="description"]')).attr('content'));
if (theMovieDbLanguage) { // netlflix üzerindeki poster url
const netflixPosterUrl = ($($('[class="img lazyload poster"]')).attr('data-src'));
// Sayfada imdb id varsa, tmdb üzerinden imdb id'ye göre arama yapılır // netflix üzerindeki age rate bilgisi
if (findImdb) { const netflixAgeRates = /<span class="border border-secondary mr-2 px-1">(.*?)<\/span>/img.exec(body)[1]
const imdbId = ($($('[class="imdbRatingPlugin"]')).attr('data-title')); // find title
tmdbURL = theMovieDbURL + 'find/' + imdbId + '?api_key=' + tmdbApiKey + '&language=' + theMovieDbLanguage + '&external_source=imdb_id'; const findTitle = ($($('[property="og:title"]')).attr('content'));
const splitString = findTitle.split("- Netflix");
// netflix title
netflixTitle = splitString[0].split("(")[0].trim();
// netflix year
const netflixYear = splitString[0].split("(")[1].split(")")[0].trim();
// type tv ise sezon sayısını, movie ise filmin süresini ayarlar
if (type == 'tv') {
netflixSeasonNumber = (/<\/span><span>(.*?)<\/h6>/img.exec(body)[1]).split('</span> ')[0]
} else {
netflixRuntime = (/<\/span><span>(.*?)<\/h6>/img.exec(body)[1]).split('</span> ')[0]
} }
// Sayfada imdb id yoksa, tmdb üzerinden title ve year'a göre arama yapılır // genre ayarlar
else { let netflixGenres = []
const findTitle = ($($('[property="og:title"]')).attr('content')); const netflixGenresFind = body.match(/<a href="\/genre\/(.*?)<\/a>/img)
const splitString = findTitle.split("- Netflix"); if (netflixGenresFind) {
title = splitString[0].split("(")[0].trim(); netflixGenresFind.forEach((genre) => {
const year = splitString[0].split("(")[1].split(")")[0].trim(); netflixGenres.push((/\/">(.*?)<\/a>/img).exec(genre)[1])
// create (find) tmdb api url })
tmdbURL = theMovieDbURL + 'search/' + type + '?api_key=' + tmdbApiKey + '&language=' + theMovieDbLanguage + '&query=' + title + '&first_air_date_year=' + year; }
// actor name ayarlar
let netflixCast = []
const netflixActorNamesFind = body.match(/<a href="\/actor\/\?name=(.*?)<\/a>/img)
if (netflixActorNamesFind) {
netflixActorNamesFind.forEach((actors) => {
netflixCast.push((/\">(.*?)<\/a>/img).exec(actors)[1])
})
} }
request(encodeURI(tmdbURL), (err, resultBody, body) => { if (theMovieDbLanguage) {
// Api find all result (for get tmdb id) // Sayfada imdb id varsa, tmdb üzerinden imdb id'ye göre arama yapılır
const getJson = JSON.parse(resultBody.body); if (findFlixableImdbId) {
const imdb = await imdbIdReal(findFlixableImdbId)
if (getJson.status_code > 1) { imdbId = imdb.id
// if wrong api key error imdbRate = imdb.rate
returnResult = { error: 1, errorMsg: 'tmdb find id wrong api key error' }; tmdbURL = theMovieDbURL + 'find/' + imdbId + '?api_key=' + tmdbApiKey + '&language=' + theMovieDbLanguage + '&external_source=imdb_id';
reject(returnResult)
} }
else { else {
// Sayfada imdb id yoksa, tmdb üzerinden title ve year'a göre arama yapılır
tmdbURL = theMovieDbURL + 'search/' + type + '?api_key=' + tmdbApiKey + '&language=' + theMovieDbLanguage + '&query=' + netflixTitle + '&first_air_date_year=' + netflixYear;
}
request(encodeURI(tmdbURL), async (err, resultBody, body) => {
if (err) { if (err) {
// if thmdb api connection error // if thmdb api connection error
returnResult = { error: 1, errorMsg: 'tmdb find id connection api error' }; reject('tmdb api find id connection error: ' + err.message)
reject(returnResult) } else {
}
else {
let result; if (resultBody) {
// Api find all result (for get tmdb id)
const getJson = JSON.parse(resultBody.body);
if (findImdb) { if (getJson.status_code > 1) {
result = type == 'movie' ? getJson.movie_results : getJson.tv_results // if wrong api key error
reject('tmdb find id wrong api key error')
}
else {
} else { let result;
result = getJson.results
}
// if tmdb api result not empty if (imdbId) {
if (result.length) { result = type == 'movie' ? getJson.movie_results : getJson.tv_results
const thmdbId = result[0].id; } else {
result = getJson.results
}
// Get detail info // if tmdb api result not empty
modules.getDetails(thmdbId, type, tmdbApiKey, theMovieDbLanguage, (err, getDetailResult) => { if (result.length) {
if (err) { const thmdbId = result[0].id;
returnResult = { error: 1, errorMsg: err };
reject(returnResult); try {
// Get detail info
const getDetailResult = await modules.getTmdbDetails('details', thmdbId, type, tmdbApiKey, theMovieDbLanguage)
// Get credits info
const getCreditsResult = await modules.getTmdbDetails('credits', thmdbId, type, tmdbApiKey)
// Get images info
const getImagesResult = await modules.getTmdbDetails('images', thmdbId, type, tmdbApiKey)
// Get trailers
const getTrailersResult = await modules.getTmdbDetails('trailers', thmdbId, type, tmdbApiKey)
// Result Object
result = {
result: 1,
error: 0,
watch: type,
imdb: {
// imdb üzerinden id alınamadıysa tmdb üzerinden alınmaya çalışılır. tmdb'de de yoksa null döner
id: (imdbId != null ? imdbId : (getDetailResult.imdb_id != undefined ? getDetailResult.imdb_id : null)),
rate: imdbRate
},
netflix: {
title: netflixTitle,
year: netflixYear,
poster_url: netflixPosterUrl,
age_rates: netflixAgeRates,
season: netflixSeasonNumber,
runtime: netflixRuntime,
overview: netflixOverview,
genres: netflixGenres,
cast: netflixCast
},
tmdb: {
details: getDetailResult,
credits: getCreditsResult,
images: getImagesResult,
trailers: getTrailersResult
}
};
resolve(result);
} catch (error) {
reject('tmdb bilgileri alinirken hata olustu: ' + error);
}
} }
else { else {
// Get credits info // Tmdb verisi yoksa sadece netflix verisi döndür
modules.getCredits(thmdbId, type, tmdbApiKey, (err, getCreditsResult) => { result = {
if (err) { result: 1,
returnResult = { error: 1, errorMsg: err }; error: 0,
reject(returnResult); watch: type,
} imdb: {
else { id: imdbId,
// Get images info rate: imdbRate
modules.getImages(thmdbId, type, tmdbApiKey, (err, getImagesResult) => { },
if (err) { netflix: {
returnResult = { error: 1, errorMsg: err }; title: netflixTitle,
reject(returnResult); year: netflixYear,
} age_rates: netflixAgeRates,
else { season: netflixSeasonNumber,
modules.getTrailers(thmdbId, type, tmdbApiKey, (err, getTrailersResult) => { runtime: netflixRuntime,
if (err) { overview: netflixOverview,
returnResult = { error: 1, errorMsg: err }; genres: netflixGenres,
reject(returnResult); cast: netflixCast
} else { },
getDetailResult.netflix_overview = netflixOverview; tmdb: null
getDetailResult.netflix_poster = netflixPoster; };
getDetailResult.netflix_title = title; resolve(result);
returnResult = { result: 1, error: 0, watch: type, details: getDetailResult, credits: getCreditsResult, images: getImagesResult, trailers: getTrailersResult };
resolve(returnResult);
}
});
}
});
}
});
} }
}); }
} } else {
else { // thmdb verisi hatalı döndüyse
// Return the empty result if tmdb return empty reject('tmdb api result.body hatalı döndü')
const returnResult = { result: 0, error: 1, msg: 'tmdb api return is empty' };
reject(returnResult)
} }
} }
} });
}); } else {
} else { // language bilgisi hatalı
returnResult = { error: 1, errorMsg: 'language parameters not found.' }; reject('language parameters not found')
reject(returnResult) }
} }
} else {
else { // Return the empty result if imdb id cannot be found
// Return the empty result if imdb id cannot be found reject('imdb id cannot be found')
const returnResult = { result: 0, error: 0, msg: 'imdb id cannot be found' }; }
reject(returnResult) } else {
reject('netflix verileri alınamadı')
} }
} }
}); });

View File

@@ -1,169 +1,54 @@
const config = require('../config'); const config = require('../config');
const request = require('request'); const request = require('request');
module.exports.getDetails = function (detailsId, movieOrTv, tmdbApiKey, language, cb) { module.exports.getTmdbDetails = function (getParamaters, thmdbId, type, tmdbApiKey, language) {
return new Promise((resolve, reject) => {
if (movieOrTv == 'movie' || movieOrTv == 'tv') { if (type == 'movie' || type == 'tv') {
const detailURL = config.theMovieDbURL + movieOrTv + '/' + detailsId + '?api_key=' + tmdbApiKey + '&language=' + language; let url
request(detailURL, (err, resultBody, body) => { switch (getParamaters) {
if (resultBody != '') { case 'details':
const getJson = JSON.parse(resultBody.body); url = config.theMovieDbURL + type + '/' + thmdbId + '?api_key=' + tmdbApiKey + '&language=' + language;
break;
if (getJson.status_code > 1) { case 'credits':
// if wrong api key error url = config.theMovieDbURL + type + '/' + thmdbId + '/credits?api_key=' + tmdbApiKey + '&language=en-US';
const error = 'tmdb get detail wrong api key error'; break;
const result = null; case 'trailers':
cb(error, result); url = config.theMovieDbURL + type + '/' + thmdbId + '/videos?api_key=' + tmdbApiKey;
} break;
else { case 'images':
if (err) { url = config.theMovieDbURL + type + '/' + thmdbId + '/images?api_key=' + tmdbApiKey + '&language=en-US&include_image_language=en,null';
// if thmdb api connection error break;
const error = 'tmdb get detail api connection error';
const result = null;
cb(error, result);
}
else {
const error = null;
const result = getJson;
cb(error, result);
}
}
} else {
const error = 'tmdb get detail api connection error';
const result = null;
cb(error, result);
} }
});
}
else {
const error = 'tmdb get detail wrong watch parameter';
const result = null;
cb(error, result);
}
}
module.exports.getCredits = function (detailsId, movieOrTv, tmdbApiKey, cb) { request(encodeURI(url), (err, resultBody, body) => {
if (movieOrTv == 'movie' || movieOrTv == 'tv') {
const creditsURL = config.theMovieDbURL + movieOrTv + '/' + detailsId + '/credits?api_key=' + tmdbApiKey + '&language=en-US';
request(creditsURL, (err, resultBody, body) => {
const getJson = JSON.parse(resultBody.body);
if (getJson.status_code > 1) {
// if wrong api key error
const error = 'tmdb get credits wrong api key error';
const result = null;
cb(error, result);
}
else {
if (err) { if (err) {
// if thmdb api connection error // if thmdb api connection error
const error = 'tmdb get credits api connection error'; reject('tmdb get detail api connection error');
const result = null;
cb(error, result);
} }
else { else {
const error = null; if (resultBody != '') {
const result = getJson; const getJson = JSON.parse(resultBody.body);
cb(error, result);
}
}
}); if (getJson.status_code > 1) {
} // if wrong api key error
else { reject('tmdb get detail wrong api key error');
const error = 'tmdb get credits wrong watch parameter'; }
const result = null; else {
cb(error, result); resolve(getJson);
} }
} } else {
// request sonucu boş dönmüşse null döndür
module.exports.getTrailers = function (detailsId, movieOrTv, tmdbApiKey, cb) { resolve(null)
if (movieOrTv == 'movie' || movieOrTv == 'tv') {
// https://api.themoviedb.org/3/movie/157336/videos?api_key=API-KEY
const trailersURL = config.theMovieDbURL + movieOrTv + '/' + detailsId + '/videos?api_key=' + tmdbApiKey;
request(trailersURL, (err, resultBody, body) => {
const getJson = JSON.parse(resultBody.body);
if (getJson.status_code > 1) {
// if wrong api key error
const error = 'tmdb get credits wrong api key error';
const result = null;
cb(error, result);
}
else {
if (err) {
// if thmdb api connection error
const error = 'tmdb get trailers api connection error';
const result = null;
cb(error, result);
}
else {
const error = null;
const result = getJson;
cb(error, result);
}
}
});
}
else {
const error = 'tmdb get trailers wrong watch parameter';
const result = null;
cb(error, result);
}
}
module.exports.getImages = function (detailsId, movieOrTv, tmdbApiKey, cb) {
if (movieOrTv == 'movie' || movieOrTv == 'tv') {
const creditsURL = config.theMovieDbURL + movieOrTv + '/' + detailsId + '/images?api_key=' + tmdbApiKey + '&language=en-US&include_image_language=en,null';
request(creditsURL, (err, resultBody, body) => {
if (resultBody != []) {
const getJson = JSON.parse(resultBody.body);
if (getJson.status_code > 1) {
// if wrong api key error
const error = 'tmdb get images wrong api key error';
const result = null;
cb(error, result);
}
else {
if (err) {
// if thmdb api connection error
const error = 'tmdb get images api connection error';
const result = null;
cb(error, result);
}
else {
const error = null;
const result = getJson;
cb(error, result);
} }
} }
} else { });
// if wrong api key error }
const error = 'error getting data'; else {
const result = null; reject('tmdb get detail wrong watch parameter');
cb(error, result); }
} })
}); }
}
else {
const error = 'tmdb get images wrong watch parameter';
const result = null;
cb(error, result);
}
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "flixinfo", "name": "flixinfo",
"version": "1.2.5", "version": "1.3.0",
"description": "Get movie detail with netflix id", "description": "Get movie detail with netflix id",
"main": "index.js", "main": "index.js",
"directories": { "directories": {