Skip to content

Commit

Permalink
Tidy code
Browse files Browse the repository at this point in the history
  • Loading branch information
edwellbrook committed Sep 29, 2016
1 parent 51f3479 commit 1118adc
Showing 1 changed file with 104 additions and 77 deletions.
181 changes: 104 additions & 77 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,52 +1,64 @@
'use strict';
/*!
* node-tvdb
*
* Node.js library for accessing TheTVDB API at <http://www.thetvdb.com/wiki/index.php?title=Programmers_API>
* Node.js library for accessing TheTVDB API at <https://api.thetvdb.com/swagger>
*
* Copyright (c) 2014-2015 Edward Wellbrook <edwellbrook@gmail.com>
* Copyright (c) 2014-2016 Edward Wellbrook <edwellbrook@gmail.com>
* MIT Licensed
*/

let request = require('request-promise');
let defaults = require('lodash/defaults');
let flatten = require('lodash/flatten');
'use strict';

const url = require('url');
const request = require('request-promise');
const flatten = require('lodash/flatten');

const BASE_URL = 'https://api.thetvdb.com/';
const LIB_VERSION = require('./package.json').version;
const USER_AGENT = `node-tvdb/${LIB_VERSION}`;

let baseUrl = 'https://api.thetvdb.com/';

//
// API Client
//

class Client {

/**
* @param {string} apiKey
* @param {string} [language]
* @param {String} apiKey
* @param {String} [language]
*/

constructor(apiKey, language = 'en') {
this.language = language;
this.token = undefined;
this.apiKey = apiKey;

this.login();
this.language = language;
}

/**
* @returns {Promise}
*/

getLanguages() {
return this.requestGet({uri: 'languages'});
return this.sendRequest('languages');
}

/**
* @param {Number|String} episodeId
* @param {String} [language]
* @returns {Promise}
*/

getEpisodeById(episodeId, language) {
return this.requestGet({uri: `episodes/${episodeId}`}, language);
return this.sendRequest(`episodes/${episodeId}`, language);
}

/**
* @param {Number|String} seriesId
* @param {String} [language]
* @returns {Promise}
*/

getEpisodesById(seriesId, language) {
return this.getEpisodesBySeriesId(seriesId, language);
}
Expand All @@ -56,17 +68,19 @@ class Client {
* @param {String} [language]
* @returns {Promise}
*/

getEpisodesBySeriesId(seriesId, language) {
return this.requestGet({uri: `series/${seriesId}/episodes`}, language);
return this.sendRequest(`series/${seriesId}/episodes`, language);
}

/**
* @param {Number|String} seriesId
* @param {String} [language]
* @returns {Promise}
*/

getSeriesById(seriesId, language) {
return this.requestGet({uri: `series/${seriesId}`}, language);
return this.sendRequest(`series/${seriesId}`, language);
}

/**
Expand All @@ -75,52 +89,58 @@ class Client {
* @param {String} [language]
* @returns {Promise}
*/

getEpisodesByAirDate(seriesId, airDate, language) {
return this.requestGet({uri: `series/${seriesId}/episodes/query?firstAired=${airDate}`}, language);
return this.sendRequest(`series/${seriesId}/episodes/query?firstAired=${airDate}`, language);
}

/**
* @param {String} name
* @param {String} [language]
* @returns {Promise}
*/

getSeriesByName(name, language) {
return this.requestGet({uri: `search/series?name=${name}`}, language);
return this.sendRequest(`search/series?name=${name}`, language);
}

/**
* @param {Number|String} seriesId
* @param {String} [language]
* @returns {Promise}
*/

getActors(seriesId, language) {
return this.requestGet({uri: `series/${seriesId}/actors`}, language);
return this.sendRequest(`series/${seriesId}/actors`, language);
}

/**
* @param {String} imdbId
* @param {String} [language]
* @returns {Promise}
*/

getSeriesByImdbId(imdbId, language) {
return this.requestGet({uri: `search/series?imdbId=${imdbId}`}, language);
return this.sendRequest(`search/series?imdbId=${imdbId}`, language);
}

/**
* @param {String} zap2ItId
* @param {String} [language]
* @returns {Promise}
*/

getSeriesByZap2ItId(zap2ItId, language) {
return this.requestGet({uri: `search/series?zap2itId=${zap2ItId}`}, language);
return this.sendRequest(`search/series?zap2itId=${zap2ItId}`, language);
}

/**
* @param {Number|String} seriesId
* @returns {Promise}
*/

getSeriesBanner(seriesId) {
return this.requestGet({uri: `series/${seriesId}/filter?keys=banner`})
return this.sendRequest(`series/${seriesId}/filter?keys=banner`)
.then(response => response.banner);
}

Expand All @@ -129,107 +149,114 @@ class Client {
* @param {Number} toTime
* @returns {Promise}
*/

getUpdates(fromTime, toTime) {
let uri = `updated/query?fromTime=${fromTime}`;
if (toTime) {
uri = `${uri}&toTime=${toTime}`;
}
return this.requestGet({uri});
return this.sendRequest(uri);
}

/**
* @param {Number|String} seriesId
* @param {String} [language]
* @returns {Promise}
*/

getSeriesAllById(seriesId, language) {
return Promise.all([
this.getSeriesById(seriesId, language),
this.getEpisodesBySeriesId(seriesId, language)
])
.then(results => {
let series = results[0];
series.Episodes = results[1];
return series;
});
.then(results => {
let series = results[0];
series.Episodes = results[1];
return series;
});
}

/**
* Performs the login into the thetvdb api and creates the loginPromise all later requests will use.
* Runs a get request with the given options, follows pages and returns the
* combined returned data of the request.
*
* @param {String} path
* @param {String} [language]
* @returns {Promise}
* @private
*/
login() {
this.loginPromise = request.post({
baseUrl,


sendRequest(path, language = this.language) {
// TODO: use saved token instead of requesting a new one
return request.post({
baseUrl: BASE_URL,
json: true,
uri: 'login',
body: {
apikey: this.apiKey
}
})
.then(data => data.token)
.then(token => {
this.defaultRequest = request.defaults({
baseUrl,

json: true,
headers: {
"User-Agent": `node-tvdb/${require('./package.json').version}`,
Authorization: `Bearer ${token}`,
'Accept-language': this.language
}
});
});
}

/**
* Runs a get request with the given options, follows pages and returns the combined returned data of the request.
*
* @param {object} options
* @param {string} [language]
* @returns {Promise}
* @private
*/
requestGet(options, language) {
options = defaults({}, options, {headers: {'Accept-language': language}});
return this.loginPromise
.then(() => this.defaultRequest.get(options))
.then(response => {
if (hasNextPage(response)) {
return this.getNextPage(response, options)
.then(nextPageResponse => [response.data, nextPageResponse])
.then(dataArray => flatten(dataArray));
.then(data => data.token)
.then(token => {
// save token for future requests
this.token = token;

return request.get({
baseUrl: BASE_URL,
uri: path,
json: true,
headers: {
'User-Agent': USER_AGENT,
'Authorization': `Bearer ${token}`,
'Accept-language': language
}
return response.data;
});
})
.then(response => {
if (hasNextPage(response)) {
return this.getNextPage(response, path, language)
.then(nextPageResponse => [response.data, nextPageResponse])
.then(dataArray => flatten(dataArray));
}
return response.data;
});
}

/**
* Returns the next page of a paged response.
*
* @param {object} response
* @param {object} options
* @param {Object} response
* @param {String} path - path for previous request
* @param {String} language
* @returns {Promise}
* @private
*/
getNextPage(response, options) {
let separator = options.uri.indexOf('?') === -1 ? '?' : '&';
let uri = options.uri + separator + 'page=' + response.links.next;
let o = defaults({uri}, options);
return this.requestGet(o);

getNextPage(response, path, language) {
let urlObj = url.parse(path, true);
urlObj.query.page = response.links.next;

const newPath = url.format(urlObj);
return this.sendRequest(newPath, language);
}
}


/**
* Returns true if the response is paged and there is a next page, false otherwise.
* Returns true if the response is paged and there is a next page, false
* otherwise.
*
* @param {object} response
* @returns {boolean}
* @param {Object} response
* @returns {Boolean}
*/

function hasNextPage(response) {
return response.links && response.links.next;
return response && response.links && response.links.next;
}


//
// Exports
//

module.exports = Client;

0 comments on commit 1118adc

Please sign in to comment.