diff options
| author | Stanley Yip <33562077+yipstanley@users.noreply.github.com> | 2019-07-30 19:40:00 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-30 19:40:00 -0400 | 
| commit | b26a257e09b9f4d8375806acb7ad143802b93603 (patch) | |
| tree | 230fe76c093084c45105ec4c3b7a53f80b3eba86 /src/server/youtubeApi/youtubeApiSample.js | |
| parent | 36ac0409b2a7a752727eaf2fc289d8cc72487619 (diff) | |
| parent | 53b8bd7ff75ee500c999a4cbc87ed75e59ef1c21 (diff) | |
Merge branch 'master' into toggle_claire
Diffstat (limited to 'src/server/youtubeApi/youtubeApiSample.js')
| -rw-r--r-- | src/server/youtubeApi/youtubeApiSample.js | 179 | 
1 files changed, 179 insertions, 0 deletions
diff --git a/src/server/youtubeApi/youtubeApiSample.js b/src/server/youtubeApi/youtubeApiSample.js new file mode 100644 index 000000000..50b3c7b38 --- /dev/null +++ b/src/server/youtubeApi/youtubeApiSample.js @@ -0,0 +1,179 @@ +const fs = require('fs'); +const readline = require('readline'); +const { google } = require('googleapis'); +const OAuth2 = google.auth.OAuth2; + + +// If modifying these scopes, delete your previously saved credentials +// at ~/.credentials/youtube-nodejs-quickstart.json +let SCOPES = ['https://www.googleapis.com/auth/youtube.readonly']; +let TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || +    process.env.USERPROFILE) + '/.credentials/'; +let TOKEN_PATH = TOKEN_DIR + 'youtube-nodejs-quickstart.json'; + +module.exports.readApiKey = (callback) => { +    fs.readFile('client_secret.json', function processClientSecrets(err, content) { +        if (err) { +            console.log('Error loading client secret file: ' + err); +            return; +        } +        callback(content); +    }); +} + +module.exports.authorizedGetChannel = (apiKey) => { +    //this didnt get called +    // Authorize a client with the loaded credentials, then call the YouTube API. +    authorize(JSON.parse(apiKey), getChannel); +} + +module.exports.authorizedGetVideos = (apiKey, userInput, callBack) => { +    authorize(JSON.parse(apiKey), getVideos, { userInput: userInput, callBack: callBack }); +} + +module.exports.authorizedGetVideoDetails = (apiKey, videoIds, callBack) => { +    authorize(JSON.parse(apiKey), getVideoDetails, { videoIds: videoIds, callBack: callBack }); +} + + +/** + * Create an OAuth2 client with the given credentials, and then execute the + * given callback function. + * + * @param {Object} credentials The authorization client credentials. + * @param {function} callback The callback to call with the authorized client. + */ +function authorize(credentials, callback, args = {}) { +    let clientSecret = credentials.installed.client_secret; +    let clientId = credentials.installed.client_id; +    let redirectUrl = credentials.installed.redirect_uris[0]; +    let oauth2Client = new OAuth2(clientId, clientSecret, redirectUrl); + +    // Check if we have previously stored a token. +    fs.readFile(TOKEN_PATH, function (err, token) { +        if (err) { +            getNewToken(oauth2Client, callback); +        } else { +            oauth2Client.credentials = JSON.parse(token); +            callback(oauth2Client, args); +        } +    }); +} + +/** + * Get and store new token after prompting for user authorization, and then + * execute the given callback with the authorized OAuth2 client. + * + * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for. + * @param {getEventsCallback} callback The callback to call with the authorized + *     client. + */ +function getNewToken(oauth2Client, callback) { +    var authUrl = oauth2Client.generateAuthUrl({ +        access_type: 'offline', +        scope: SCOPES +    }); +    console.log('Authorize this app by visiting this url: ', authUrl); +    var rl = readline.createInterface({ +        input: process.stdin, +        output: process.stdout +    }); +    rl.question('Enter the code from that page here: ', function (code) { +        rl.close(); +        oauth2Client.getToken(code, function (err, token) { +            if (err) { +                console.log('Error while trying to retrieve access token', err); +                return; +            } +            oauth2Client.credentials = token; +            storeToken(token); +            callback(oauth2Client); +        }); +    }); +} + +/** + * Store token to disk be used in later program executions. + * + * @param {Object} token The token to store to disk. + */ +function storeToken(token) { +    try { +        fs.mkdirSync(TOKEN_DIR); +    } catch (err) { +        if (err.code != 'EEXIST') { +            throw err; +        } +    } +    fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => { +        if (err) throw err; +        console.log('Token stored to ' + TOKEN_PATH); +    }); +    console.log('Token stored to ' + TOKEN_PATH); +} + +/** + * Lists the names and IDs of up to 10 files. + * + * @param {google.auth.OAuth2} auth An authorized OAuth2 client. + */ +function getChannel(auth) { +    var service = google.youtube('v3'); +    service.channels.list({ +        auth: auth, +        part: 'snippet,contentDetails,statistics', +        forUsername: 'GoogleDevelopers' +    }, function (err, response) { +        if (err) { +            console.log('The API returned an error: ' + err); +            return; +        } +        var channels = response.data.items; +        if (channels.length == 0) { +            console.log('No channel found.'); +        } else { +            console.log('This channel\'s ID is %s. Its title is \'%s\', and ' + +                'it has %s views.', +                channels[0].id, +                channels[0].snippet.title, +                channels[0].statistics.viewCount); +        } +    }); +} + +function getVideos(auth, args) { +    let service = google.youtube('v3'); +    service.search.list({ +        auth: auth, +        part: 'id, snippet', +        type: 'video', +        q: args.userInput, +        maxResults: 10 +    }, function (err, response) { +        if (err) { +            console.log('The API returned an error: ' + err); +            return; +        } +        let videos = response.data.items; +        args.callBack(videos); +    }); +} + +function getVideoDetails(auth, args) { +    if (args.videoIds === undefined) { +        return; +    } +    let service = google.youtube('v3'); +    service.videos.list({ +        auth: auth, +        part: 'contentDetails, statistics', +        id: args.videoIds +    }, function (err, response) { +        if (err) { +            console.log('The API returned an error from details: ' + err); +            return; +        } +        let videoDetails = response.data.items; +        args.callBack(videoDetails); +    }); +}
\ No newline at end of file  | 
