UNPKG

2.96 kBJavaScriptView Raw
1
2/*
3 * Module dependencies
4 */
5
6var request = require('superagent');
7var endpoints = require('./endpoints.json');
8
9/*
10 * Exports the constructor
11 */
12
13module.exports = function(api_key, base_url) {
14 if(api_key) return new MovieDB(api_key, base_url);
15 else throw new Error('Bad api key');
16};
17
18/*
19 * Constructor
20 */
21
22function MovieDB(api_key, base_url) {
23 this.api_key = api_key;
24 if(base_url) endpoints.base_url = base_url;
25 return this;
26}
27
28/*
29 * API request token
30 */
31
32MovieDB.prototype.requestToken = function(fn){
33 var self = this;
34
35 request
36 .get(endpoints.base_url + endpoints.authentication.requestToken)
37 .query({'api_key': self.api_key})
38 .set('Accept', 'application/json')
39 .end(function(err, res){
40 if(err) {
41 fn(err);
42 } else {
43 self.token = res.body;
44 fn();
45 }
46 });
47
48 return this;
49};
50
51/*
52 * API session
53 */
54
55MovieDB.prototype.session = function(fn){
56 var self = this;
57
58 request
59 .get(endpoints.base_url + endpoints.authentication.session)
60 .query({'api_key': self.api_key, 'request_token': self.token.request_token})
61 .set('Accept', 'application/json')
62 .end(function(err, res){
63 if(err) {
64 fn(err);
65 } else {
66 if (res.body.success) {
67 self.session_id = res.body.session_id;
68 fn();
69 }
70 else fn(res.body);
71 }
72 });
73
74 return this;
75};
76
77/*
78 * Generate API methods
79 */
80
81Object.keys(endpoints.methods).forEach(function(method){
82 var met = endpoints.methods[method];
83 Object.keys(met).forEach(function(m){
84 MovieDB.prototype[method + m] = function(params, fn){
85 var self = this;
86
87 if("function" == typeof params) {
88 fn = params;
89 params = {};
90 }
91
92 if(!this.token || Date.now() > +new Date(this.token.expires_at)) {
93 this.requestToken(function(err){
94 if(err) return fn(err);
95 execMethod.call(self, met[m].method, params, met[m].resource, fn);
96 });
97 } else {
98 execMethod.call(this, met[m].method, params, met[m].resource, fn);
99 }
100
101 return this;
102 };
103 });
104});
105
106var execMethod = function(type, params, endpoint, fn){
107 params = params || {};
108 endpoint = endpoint.replace(':id', params.id).replace(':season_number', params.season_number).replace(':episode_number', params.episode_number);
109 type = type.toUpperCase();
110
111 var req = request(type, endpoints.base_url + endpoint)
112 .query({api_key : this.api_key, session_id: this.session_id})
113 .set('Accept', 'application/json');
114
115 if (params.ifNoneMatch) {
116 req=req.set('If-None-Match', params.ifNoneMatch);
117
118 } else if (params.ifModifiedSince) {
119 var t=params.ifModifiedSince;
120 if (t.toUTCString) {
121 t=t.toUTCString();
122 }
123 req=req.set('If-Modified-Since', t);
124 }
125
126 if(type === 'GET')
127 req.query(params);
128 else
129 req.send(params);
130
131 req.end(function(err, res){
132 if(err){
133 fn(err, null, res);
134 } else {
135 fn(null, res.body, res);
136 }
137 });
138};