Skip to content

Commit 8cc00ce

Browse files
committed
add TVDB api query
based on Step 6
1 parent 7c08b00 commit 8cc00ce

File tree

2 files changed

+93
-5
lines changed

2 files changed

+93
-5
lines changed

package.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
"start": "node ./bin/www"
77
},
88
"dependencies": {
9-
"express": "~4.9.0",
9+
"async": "^0.9.0",
10+
"bcryptjs": "^2.0.2",
1011
"body-parser": "~1.8.1",
1112
"cookie-parser": "~1.3.3",
12-
"morgan": "~1.3.0",
13-
"serve-favicon": "~2.1.3",
1413
"debug": "~2.0.0",
14+
"express": "~4.9.0",
1515
"jade": "~1.6.0",
16+
"lodash": "^2.4.1",
1617
"mongoose": "^3.8.17",
17-
"bcryptjs": "^2.0.2"
18+
"morgan": "~1.3.0",
19+
"request": "^2.45.0",
20+
"serve-favicon": "~2.1.3",
21+
"xml2js": "^0.4.4"
1822
},
1923
"devDependencies": {
2024
"browser-sync": "^1.3.7",

server.js

+85-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ var express = require('express'),
44
cookieParser = require('cookie-parser'),
55
bodyParser = require('body-parser'),
66
mongoose = require('mongoose'),
7-
bcrypt = require('bcryptjs');
7+
bcrypt = require('bcryptjs'),
8+
async = require('async'),
9+
request = require('request'),
10+
xml2js = require('xml2js'),
11+
_ = require('lodash');
812

913

1014
/*
@@ -107,6 +111,86 @@ app.get('/api/shows/:id', function(req, res, next) {
107111
});
108112
});
109113

114+
app.post('/api/shows', function(req, res, next) {
115+
var apiKey = '9EF1D1E7D28FDA0B';
116+
var parser = xml2js.Parser({
117+
explicitArray: false,
118+
normalizeTags: true
119+
});
120+
var seriesName = req.body.showName
121+
.toLowerCase()
122+
.replace(/ /g, '_')
123+
.replace(/[^\w-]+/g, '');
124+
125+
async.waterfall([
126+
function(callback) {
127+
request.get('http://thetvdb.com/api/GetSeries.php?seriesname=' + seriesName, function(error, response, body) {
128+
if (error) return next(error);
129+
parser.parseString(body, function(err, result) {
130+
if (!result.data.series) {
131+
return res.send(404, { message: req.body.showName + ' was not found.' });
132+
}
133+
var seriesId = result.data.series.seriesid || result.data.series[0].seriesid;
134+
callback(err, seriesId);
135+
});
136+
});
137+
},
138+
function(seriesId, callback) {
139+
request.get('http://thetvdb.com/api/' + apiKey + '/series/' + seriesId + '/all/en.xml', function(error, response, body) {
140+
if (error) return next(error);
141+
parser.parseString(body, function(err, result) {
142+
var series = result.data.series;
143+
var episodes = result.data.episode;
144+
var show = new Show({
145+
_id: series.id,
146+
name: series.seriesname,
147+
airsDayOfWeek: series.airs_dayofweek,
148+
airsTime: series.airs_time,
149+
firstAired: series.firstaired,
150+
genre: series.genre.split('|').filter(Boolean),
151+
network: series.network,
152+
overview: series.overview,
153+
rating: series.rating,
154+
ratingCount: series.ratingcount,
155+
runtime: series.runtime,
156+
status: series.status,
157+
poster: series.poster,
158+
episodes: []
159+
});
160+
_.each(episodes, function(episode) {
161+
show.episodes.push({
162+
season: episode.seasonnumber,
163+
episodeNumber: episode.episodenumber,
164+
episodeName: episode.episodename,
165+
firstAired: episode.firstaired,
166+
overview: episode.overview
167+
});
168+
});
169+
callback(err, show);
170+
});
171+
});
172+
},
173+
function(show, callback) {
174+
var url = 'http://thetvdb.com/banners/' + show.poster;
175+
request({ url: url, encoding: null }, function(error, response, body) {
176+
show.poster = 'data:' + response.headers['content-type'] + ';base64,' + body.toString('base64');
177+
callback(error, show);
178+
});
179+
}
180+
], function(err, show) {
181+
if (err) return next(err);
182+
show.save(function(err) {
183+
if (err) {
184+
if (err.code == 11000) {
185+
return res.send(409, { message: show.name + ' already exists.' });
186+
}
187+
return next(err);
188+
}
189+
res.send(200);
190+
});
191+
});
192+
});
193+
110194
app.get('*', function(req, res) {
111195
res.redirect('/#' + req.originalUrl);
112196
});

0 commit comments

Comments
 (0)