jalak vora
jalak vora

Reputation: 149

Download a youtube video file in node js using ytdl

I want to make user able to download a youtube video using node-ytdl. For example when client side make a GET request for certain route the video should be downloaded in response.

  var ytdl = require('ytdl-core');
  var express= require('express');

   //Init App Instance
    var app=express();



 app.get('/video',function(req,res){


 var ytstream=ytdl("https://www.youtube.com/watch?v=hgvuvdyzYFc");


ytstream.on('data',function(data){
   res.write(data);
})

ytstream.on('end',function(data){
    res.send();
})

})

Above is my nodejs code. Even though in network it seems to download the response it does not make user download as a file.I don't want to store any file on server.It would be great if someone could help me how to solve the issue.

Upvotes: 2

Views: 5521

Answers (3)

Aqil Contractor
Aqil Contractor

Reputation: 73

Ok, so make a string var, then add data to it on the data event. On end, send everything. Here is an example:

const ytdl = require("ytdl-core"),
      app = require("express")();

app.get("/video", (req, res) => {
  let data = "", vid = ytdl("https://www.youtube.com/watch?v=hgvuvdyzYFc");
  vid.on("data", d => data += d);
  vid.on("end", () => res.send(data));
  res.header("Content-Disposition", 'attachment; filename="Video.mp4');
});

Upvotes: 1

Kaleem Shoukat
Kaleem Shoukat

Reputation: 859

You have to also pass the headers. Try it:

app.get('/video', (req, res) => {
    var url = "https://www.youtube.com/watch?v=hgvuvdyzYFc";
    res.header("Content-Disposition", 'attachment; filename="Video.mp4');
    ytdl(url, {format: 'mp4'}).pipe(res);
});

If someone is still getting an error just update the package to latest version by running:

npm i ytdl-core@latest

Upvotes: 1

iamsr
iamsr

Reputation: 412

res object is a writable stream so you can directly pipe the output of ytdl to res object like this -

    ytdl("http://www.youtube.com/watch?v=xzjxhskd")
      .on("response", response => {
        // If you want to set size of file in header
        res.setHeader("content-length", response.headers["content-length"]);
      })
      .pipe(res);

Upvotes: 1

Related Questions