161 lines
4.3 KiB
JavaScript
161 lines
4.3 KiB
JavaScript
![]() |
var alexa = require('alexa-app');
|
||
|
var request = require('request');
|
||
|
var dotenv = require('dotenv').config();
|
||
|
var CouchPotato = require('node-couchpotato');
|
||
|
|
||
|
var app = new alexa.app();
|
||
|
var cp = new CouchPotato({
|
||
|
url: dotenv.CP_URL,
|
||
|
apikey: dotenv.CP_API_KEY,
|
||
|
debug: true
|
||
|
});
|
||
|
|
||
|
function buildNextMovieSuggestionPrompt(movies) {
|
||
|
var promptData = {
|
||
|
searchResults: movies.slice(0, 5),
|
||
|
yesAction : 'addMovie',
|
||
|
yesResponse: 'Added ' + movies[0].original_title + ' (' + movies[0].year + ')' + ' to your list of movies to download.'
|
||
|
};
|
||
|
|
||
|
if (movies.length > 1) {
|
||
|
promptData.noAction = 'suggestNextMovie';
|
||
|
promptData.noResponse = 'Ok, did you mean ' + movies[1].original_title + ' (' + movies[1].year + ')' + '?';
|
||
|
}
|
||
|
else {
|
||
|
promptData.noAction = 'endSession';
|
||
|
promptData.noResponse = 'Ok. I\'m out of suggestions. Sorry about that.';
|
||
|
}
|
||
|
|
||
|
return promptData;
|
||
|
}
|
||
|
|
||
|
function formatMovieSearchResponse(movies, resp) {
|
||
|
if(!movies || !movies.length) {
|
||
|
resp.say("No movie found for " + movieName);
|
||
|
return resp.send();
|
||
|
}
|
||
|
|
||
|
var speechText = 'Add ' + movies[0].original_title + ' (' + movies[0].year + ')' + ' to your list?';
|
||
|
// console.log('movie found', speechText);
|
||
|
// console.log('reprompt data', buildNextMovieSuggestionPrompt(movies.slice(0, 5)));
|
||
|
|
||
|
resp
|
||
|
.say(speechText)
|
||
|
.session('promptData', buildNextMovieSuggestionPrompt(movies.slice(0, 5)))
|
||
|
.shouldEndSession(false)
|
||
|
.send();
|
||
|
}
|
||
|
|
||
|
app.intent('FindMovie', function (req, resp) {
|
||
|
var movieName = req.slot('movieName');
|
||
|
|
||
|
// console.log('search for movie in list', movieName);
|
||
|
cp.movie.list({search: movieName, limit_offset: 5}).then(function (searchResp) {
|
||
|
var movies = searchResp.movies;
|
||
|
var result;
|
||
|
var speechText;
|
||
|
|
||
|
if (!movies || !movies.length) {
|
||
|
speechText = "Couldn't find " + movieName + " queued for download. ";
|
||
|
resp.say(speechText);
|
||
|
|
||
|
// console.log('no movie found', speechText);
|
||
|
|
||
|
cp.movie.search(movieName).then(function (searchResults) {
|
||
|
formatMovieSearchResponse(searchResults, resp);
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
result = movies[0].info;
|
||
|
speechText = 'It looks like ' + result.original_title + ' (' + result.year + ')' + ' is already on your list.';
|
||
|
|
||
|
// console.log('movie found', speechText);
|
||
|
|
||
|
resp
|
||
|
.say(speechText)
|
||
|
.send();
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
// console.log('reprompt data', buildNextMovieSuggestionPrompt(movies.slice(0, 5)));
|
||
|
});
|
||
|
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
app.intent('AddMovie', function (req, resp) {
|
||
|
var movieName = req.slot('movieName');
|
||
|
|
||
|
// console.log('search for movie', movieName);
|
||
|
cp.movie.search(movieName).then(function (movies) {
|
||
|
formatMovieSearchResponse(movies, resp);
|
||
|
});
|
||
|
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
app.intent('AMAZON.YesIntent', function (req, resp) {
|
||
|
var promptData = req.session('promptData');
|
||
|
|
||
|
if (!promptData) {
|
||
|
console.log('Got a AMAZON.YesIntent but no promptData. Ending session.');
|
||
|
return resp.send();
|
||
|
}
|
||
|
|
||
|
if (promptData.yesAction === 'addMovie') {
|
||
|
// console.log('promptData', promptData);
|
||
|
var movie = promptData.searchResults[0];
|
||
|
|
||
|
// console.log('Add the movie', movie.original_title);
|
||
|
cp.movie.add({
|
||
|
title: movie.titles[0],
|
||
|
identifier: movie.imdb
|
||
|
}).then(function () {
|
||
|
resp
|
||
|
.say(promptData.yesResponse)
|
||
|
.send();
|
||
|
});
|
||
|
}
|
||
|
else {
|
||
|
console.log("Got an unexpected yesAction. PromptData:");
|
||
|
console.log(promptData);
|
||
|
return resp.send();
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
app.intent('AMAZON.NoIntent', function (req, resp) {
|
||
|
var promptData = req.session('promptData');
|
||
|
|
||
|
if (!promptData) {
|
||
|
console.log('Got a AMAZON.YesIntent but no promptData. Ending session.');
|
||
|
return resp.send();
|
||
|
}
|
||
|
|
||
|
if (promptData.noAction === 'endSession') {
|
||
|
return resp.say(promptData.noResponse).send();
|
||
|
}
|
||
|
else if (promptData.noAction === 'suggestNextMovie') {
|
||
|
var movies = promptData.searchResults;
|
||
|
return resp
|
||
|
.say(promptData.noResponse)
|
||
|
.session('promptData', buildNextMovieSuggestionPrompt(movies.slice(1)))
|
||
|
.shouldEndSession(false)
|
||
|
.send();
|
||
|
}
|
||
|
else {
|
||
|
console.log("Got an unexpected noAction. PromptData:");
|
||
|
console.log(promptData);
|
||
|
return resp.send();
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
app.intent('AMAZON.CancelIntent', function (req, resp) {
|
||
|
resp.shouldEndSession(true).send();
|
||
|
});
|
||
|
|
||
|
exports.handler = app.lambda();
|