mirror of
				https://github.com/KevinMidboe/moviedb.git
				synced 2025-10-29 17:50:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
 | 
						|
/*
 | 
						|
 * Module dependencies
 | 
						|
 */
 | 
						|
 | 
						|
var request = require('superagent');
 | 
						|
var endpoints = require('./endpoints.json');
 | 
						|
 | 
						|
/*
 | 
						|
 * Exports the constructor
 | 
						|
 */
 | 
						|
 | 
						|
module.exports = function(api_key, base_url) {
 | 
						|
  if(api_key) return new MovieDB(api_key, base_url);
 | 
						|
  else throw new Error('Bad api key');
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Constructor
 | 
						|
 */
 | 
						|
 | 
						|
function MovieDB(api_key, base_url) {
 | 
						|
  this.api_key = api_key;
 | 
						|
  if(base_url) endpoints.base_url = base_url;
 | 
						|
  return this;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * API request token
 | 
						|
 */
 | 
						|
 | 
						|
MovieDB.prototype.requestToken = function(fn){
 | 
						|
  var self = this;
 | 
						|
 | 
						|
  request
 | 
						|
  .get(endpoints.base_url  + endpoints.authentication.requestToken)
 | 
						|
  .query({'api_key': self.api_key})
 | 
						|
  .set('Accept', 'application/json')
 | 
						|
  .end(function(err, res){
 | 
						|
    if(err) {
 | 
						|
      fn(err);
 | 
						|
    } else {
 | 
						|
      self.token = res.body;
 | 
						|
      fn();
 | 
						|
    }
 | 
						|
  });
 | 
						|
 | 
						|
  return this;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * API session
 | 
						|
 */
 | 
						|
 | 
						|
MovieDB.prototype.session = function(fn){
 | 
						|
  var self = this;
 | 
						|
 | 
						|
  request
 | 
						|
  .get(endpoints.base_url  + endpoints.authentication.session)
 | 
						|
  .query({'api_key': self.api_key, 'request_token': self.token.request_token})
 | 
						|
  .set('Accept', 'application/json')
 | 
						|
  .end(function(err, res){
 | 
						|
    if(err) {
 | 
						|
      fn(err);
 | 
						|
    } else {
 | 
						|
      if (res.body.success) {
 | 
						|
        self.session_id = res.body.session_id;
 | 
						|
        fn();   
 | 
						|
      } 
 | 
						|
      else fn(res.body);
 | 
						|
    }
 | 
						|
  });
 | 
						|
 | 
						|
  return this;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Generate API methods
 | 
						|
 */
 | 
						|
 | 
						|
Object.keys(endpoints.methods).forEach(function(method){
 | 
						|
  var met = endpoints.methods[method];
 | 
						|
  Object.keys(met).forEach(function(m){
 | 
						|
    MovieDB.prototype[method + m] = function(params, fn){
 | 
						|
      var self = this;
 | 
						|
 | 
						|
      if("function" == typeof params) {
 | 
						|
        fn = params;
 | 
						|
        params = {};
 | 
						|
      }
 | 
						|
 | 
						|
      if(!this.token || Date.now() > +new Date(this.token.expires_at)) {
 | 
						|
        this.requestToken(function(err){
 | 
						|
          if(err) return fn(err);
 | 
						|
          execMethod.call(self, met[m].method, params, met[m].resource, fn);
 | 
						|
        });    
 | 
						|
      } else {
 | 
						|
        execMethod.call(this, met[m].method, params, met[m].resource, fn);
 | 
						|
      } 
 | 
						|
 | 
						|
      return this;
 | 
						|
    };
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
var execMethod = function(type, params, endpoint, fn){
 | 
						|
  params = params || {};
 | 
						|
  endpoint = endpoint.replace(':id', params.id).replace(':season_number', params.season_number).replace(':episode_number', params.episode_number);
 | 
						|
  type = type.toUpperCase();
 | 
						|
  
 | 
						|
  var req = request(type, endpoints.base_url + endpoint)
 | 
						|
            .query({api_key : this.api_key, session_id: this.session_id})
 | 
						|
            .set('Accept', 'application/json');
 | 
						|
  
 | 
						|
  if (params.ifNoneMatch) {
 | 
						|
    req=req.set('If-None-Match', params.ifNoneMatch);
 | 
						|
    
 | 
						|
  } else if (params.ifModifiedSince) {
 | 
						|
    var t=params.ifModifiedSince;
 | 
						|
    if (t.toUTCString) {
 | 
						|
      t=t.toUTCString();
 | 
						|
    }
 | 
						|
    req=req.set('If-Modified-Since', t);
 | 
						|
  }
 | 
						|
 | 
						|
  if(type === 'GET')
 | 
						|
    req.query(params);
 | 
						|
  else
 | 
						|
    req.send(params);
 | 
						|
 | 
						|
  req.end(function(err, res){
 | 
						|
    if(err){
 | 
						|
      fn(err, null, res);
 | 
						|
    } else {
 | 
						|
      fn(null, res.body, res);
 | 
						|
    }
 | 
						|
  });
 | 
						|
};
 |