@vimeo/vimeo
Version:
A Node.js library for the new Vimeo API.
200 lines (180 loc) • 7.74 kB
JavaScript
/**
* Copyright 2013 Vimeo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const Vimeo = require('../index').Vimeo
const utilModule = require('util')
let config = {}
try {
config = require('./config.json')
} catch (error) {
console.error('ERROR: For this example to run properly you must create an API app at ' +
'https://developer.vimeo.com/apps/new and set your callback url to ' +
'`http://localhost:8080/oauth_callback`.')
console.error('ERROR: Once you have your app, make a copy of `config.json.example` named ' +
'`config.json` and add your client ID, client secret and access token.')
process.exit()
}
const httpModule = require('http')
const urlModule = require('url')
const stateData = {
state: 'unauthorized'
}
// Here we have to build the Vimeo library using the configured `client_id` and `client_secret`. We
// do not need an access token here because we will generate one. If we already knew our access
// token, we can provide it as the third parameter.
const lib = new Vimeo(config.client_id, config.client_secret, config.access_token)
const scopes = ['public', 'private', 'edit', 'interact']
const callbackUrl = 'http://localhost:8080/oauth_callback'
// The authorization process requires the user to be redirected back to a webpage, so we can start
// up a simple HTTP server here.
const server = httpModule.createServer(function (request, response) {
const url = urlModule.parse(request.url, true) // eslint-disable-line n/no-deprecated-api
// Once the user accepts your app, they will be redirected back to
// `http://localhost:8080/oauth_callback`. If they are not redirected you should check your apps
// configuration at https://developer.vimeo.com/apps.
if (url.pathname === '/oauth_callback') {
if (url.query.state !== 'abcdefg') {
throw new Error('invalid state')
}
if (!url.query.error) {
// At this state, a request to `/oauth_callback` without an error parameter, the user has been
// redirected back to the app and you can exchange the "code" parameter for an access token.
console.info('successful oauth callback request')
lib.accessToken(url.query.code, callbackUrl, function (err, token) {
if (err) {
return response.end('error=\n' + err)
}
if (token.access_token) {
// At this state the code has been successfully exchanged for an access token
lib.setAccessToken(token.access_token)
stateData.user = token.user
stateData.state = 'authorized'
response.statusCode = 302
response.setHeader('Location', '/')
response.end()
} else {
throw new Error('no access token provided')
}
})
} else {
// At this state, a request to `/oauth_callback` with an error parameter, something went wrong
// when you sent your user to Vimeo. The error parameter should tell you more.
console.error('failed oauth callback request')
console.error(url.query.error)
response.setHeader('Content-Type', 'text/html')
response.write('<p>Your command line is currently unauthenticated. Please ' +
'<a href="' + lib.buildAuthorizationEndpoint(callbackUrl, scopes, 'abcdefg') + '">' +
'Link with Vimeo</a></p>')
response.write('<code>' + JSON.stringify(url.query) + '</code>')
response.end()
}
} else {
if (stateData.state !== 'authorized') {
// At this state, any request where `stateData.state` has not been set to "authorized", we do
// not have an authentication token, so we need to send the user to Vimeo.
console.info('HTTP request without access token.')
response.setHeader('Content-Type', 'text/html')
response.write('<p>Your command line is currently unauthenticated. Please ' +
'<a href="' + lib.buildAuthorizationEndpoint(callbackUrl, scopes, 'abcdefg') +
'">Link with Vimeo</a></p>')
response.end()
} else {
// At this state, `stateData.state` has been set to "authorized" when we retrieved the access
// token, we can make authenticated API requests.
console.info('HTTP request with access token.')
response.setHeader('Content-Type', 'text/html')
response.write('<p>Your command line is currently authorized with the user: <a href="' +
stateData.user.link + '">' + stateData.user.name + '</a>.</p>')
response.write('<p>You can make API requests via the command line using the "request" ' +
'function, or upload files using the "upload" function.</p>')
response.write('<p>Try "request(\'/me\');"</p>')
response.end()
}
}
})
server.listen(8080, function () {
console.log('Server started on 8080. Open up http://localhost:8080 in your browser.')
})
const context = require('repl').start({}).context
/**
* This will upload the video to the authenticated account.
*
* @param {string} path The path to the video file.
* @param {string=} videoUri If provided, this upload will replace the source file of the video URI
* provided.
*/
context.upload = function (path, videoUri) {
lib.streamingUpload(path, videoUri, function (err, data, status, headers) {
if (err) {
console.log('---upload error---')
console.log('error')
console.log(err)
console.log('response body')
console.log(data)
console.log('response status')
console.log(status)
console.log('response headers')
console.log(headers)
} else {
console.log('---upload success---')
console.log('response body')
console.log(data)
console.log('response status')
console.log(status)
console.log('response headers')
console.log(headers)
}
})
}
/**
* This method lets you make API requests.
*
* - `options.method` is a string of the HTTP method for the request (GET, POST, PUT, PATCH,
* DELETE)
* - `options.path` is a string of the path portion of a url (eg. /users/dashron)
* - `options.query` is an object containing all of your request parameters. If GET they will be
* appended to the url, if POST it will be part of your request body
* - `options.headers` is an object containing key value pairings of all of the HTTP request
* headers
*
* @param {Object|string} options If string, it will make a GET request to that url. If an object,
* you can provide many parameters. See the function description for
* more.
*/
context.request = function (options) {
if (typeof options === 'string') {
options = { path: options }
}
lib.request(options, function (err, data, status, headers) {
if (err) {
console.log('---request error---')
console.log('status')
console.log(status)
console.log('headers')
console.log(headers)
console.log('error')
console.log(utilModule.inspect(err))
} else {
console.log('---request success---')
console.log('status')
console.log(status)
console.log('headers')
console.log(headers)
console.log('response')
console.log(data)
}
})
}