@@ -4,7 +4,11 @@ var express = require('express'),
4
4
cookieParser = require ( 'cookie-parser' ) ,
5
5
bodyParser = require ( 'body-parser' ) ,
6
6
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' ) ;
8
12
9
13
10
14
/*
@@ -107,6 +111,86 @@ app.get('/api/shows/:id', function(req, res, next) {
107
111
} ) ;
108
112
} ) ;
109
113
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
+
110
194
app . get ( '*' , function ( req , res ) {
111
195
res . redirect ( '/#' + req . originalUrl ) ;
112
196
} ) ;
0 commit comments