/youtube-api

:video_camera: A Node.JS module, which provides an object oriented wrapper for the YouTube v3 API.

Primary LanguageJavaScriptMIT LicenseMIT

youtube-api

Patreon PayPal AMA Version Downloads Get help on Codementor

A Node.JS module, which provides an object oriented wrapper for the Youtube v3 API.

☁️ Installation

$ npm i --save youtube-api

📋 Example

/**
 * This script uploads a video (specifically `video.mp4` from the current
 * directory) to YouTube,
 *
 * To run this script you have to create OAuth2 credentials and download them
 * as JSON and replace the `credentials.json` file. Then install the
 * dependencies:
 *
 * npm i r-json lien opn bug-killer
 *
 * Don't forget to run an `npm i` to install the `youtube-api` dependencies.
 * */

const Youtube = require("youtube-api")
    , fs = require("fs")
    , readJson = require("r-json")
    , Lien = require("lien")
    , Logger = require("bug-killer")
    , opn = require("opn")
    , prettyBytes = require("pretty-bytes")
    ;

// I downloaded the file from OAuth2 -> Download JSON
const CREDENTIALS = readJson(`${__dirname}/credentials.json`);

// Init lien server
let server = new Lien({
    host: "localhost"
  , port: 5000
});

// Authenticate
// You can access the Youtube resources via OAuth2 only.
// https://developers.google.com/youtube/v3/guides/moving_to_oauth#service_accounts
let oauth = Youtube.authenticate({
    type: "oauth"
  , client_id: CREDENTIALS.web.client_id
  , client_secret: CREDENTIALS.web.client_secret
  , redirect_url: CREDENTIALS.web.redirect_uris[0]
});

opn(oauth.generateAuthUrl({
    access_type: "offline"
  , scope: ["https://www.googleapis.com/auth/youtube.upload"]
}));

// Handle oauth2 callback
server.addPage("/oauth2callback", lien => {
    Logger.log("Trying to get the token using the following code: " + lien.query.code);
    oauth.getToken(lien.query.code, (err, tokens) => {

        if (err) {
            lien.lien(err, 400);
            return Logger.log(err);
        }

        Logger.log("Got the tokens.");

        oauth.setCredentials(tokens);

        lien.end("The video is being uploaded. Check out the logs in the terminal.");

        var req = Youtube.videos.insert({
            resource: {
                // Video title and description
                snippet: {
                    title: "Testing YoutTube API NodeJS module"
                  , description: "Test video upload via YouTube API"
                }
                // I don't want to spam my subscribers
              , status: {
                    privacyStatus: "private"
                }
            }
            // This is for the callback function
          , part: "snippet,status"

            // Create the readable stream to upload the video
          , media: {
                body: fs.createReadStream("video.mp4")
            }
        }, (err, data) => {
            console.log("Done.");
            process.exit();
        });

        setInterval(function () {
            Logger.log(`${prettyBytes(req.req.connection._bytesDispatched)} bytes uploaded.`);
        }, 250);
    });
});

📝 Documentation

The official Youtube documentation is a very useful resource.

If you have any questions, just open an issue.

Authentication

OAuth (Access Token)

Youtube.authenticate({
    type: "oauth"
  , token: "your access token"
});

OAuth (Refresh Token)

Youtube.authenticate({
    type: "oauth"
  , refresh_token: "your refresh token"
  , client_id: "your client id"
  , client_secret: "your client secret"
  , redirect_url: "your refresh url"
});

Server Key

Only for requests that don't require user authorization (certain list operations)

Youtube.authenticate({
    type: "key"
  , key: "your server key"
});

😋 How to contribute

Have an idea? Found a bug? See how to contribute.

💰 Donations

Another way to support the development of my open-source modules is to set up a recurring donation, via Patreon. 🚀

PayPal donations are appreciated too! Each dollar helps.

Thanks! ❤️

💫 Where is this library used?

If you are using this library in one of your projects, add it in this list. ✨

  • adasq-services-ytv—It creates news feed from youtube search result, for specific queries
  • anitube (by kikura-yuichiro)—node module for getting youtube video url of japanese animation OP/ED movie
  • kyot-sunday-playlists (by Alin Pandichi)—Kyot Sunday Playlists
  • mediacenterjs (by Jan Smolders)—A NodeJS based mediacenter for your browser
  • mediacenterjs-youtube (by Jan Smolders)—A Youtube app for mediacenterjs
  • node-red-contrib-youtube (by scaw.dev)—Youtube nodes for node-red
  • node-red-node-youtube (by Jay Long)—A Node-RED node to access Youtube Data API.
  • node-youtubeapi-simplifier (by Haidy777)—The Youtube-API probably isn't the simplest api in the world. So why isn't there a simplifier? Well, don't worry, now there is one :)
  • pullplaylist (by Sameid Usmani)—Youtube video downloader in pure javascript.
  • steam-chat-bot (by See contributors)—Simplified interface for a steam chat bot with lots of built-in functionality
  • test-youtube-api—Test Youtube API NodeJS module
  • youtube-album-uploader (by Jared Chapiewsky)—Uploads an mp3 album to Youtube
  • youtube-playlist-info (by Benjamin Kaiser)—Youtube playlist information fetcher.
  • youtube-vanitystats (by Sebastian Patten)—A scheduled job that will will query YouTube's API for a given video ID. It will then email you the number of views and amount of revenue you have made since the last time it was run.

📜 License

MIT © Ionică Bizău