Więc tworzę YouTube Downloader za pomocą węzła. Problemem jest pliki są już utworzone po uruchomieniu kodu, ale pliki są 0 KB i drukuje z powodzeniem. Chcę, aby program musi być drukowany z pomyślnie, gdy pomyślnie pobieram wideo, również nie może być jeszcze utworzony plik. Plik musi być utworzony po pomyślnym pobraniu jednego filmu

const playlist = [
  {
    title: "What is DevOps",
    videoUrl: "https://www.youtube.com/watch?v=mBBgRdlC4sc",
  },
  {
    title: "Introduction To DevOps ",
    videoId: "Me3ea4nUt0U",
    videoUrl: "https://www.youtube.com/watch?v=Me3ea4nUt0U",
  },
  {
    title: "DevOps Tutorial For Beginners ",
    videoId: "YSkDtQ2RA_c",
    videoUrl: "https://www.youtube.com/watch?v=YSkDtQ2RA_c",
  },
];
const fs = require("fs");
const ytdl = require("ytdl-core");
const length = playlist.length;

playlist.forEach((pl, i) => {
  const { videoUrl, title } = pl;
  const item = i + 1;

  ytdl(videoUrl, {
    format: "mp4",
  }).pipe(fs.createWriteStream(`${title}.mp4`));
  console.log(`${item}/${length} - ${title} downloaded successfully`);
});
4
kennethreyt 28 lipiec 2020, 13:59

1 odpowiedź

Najlepsza odpowiedź

Rejestrujesz "pomyślnie pobrane" przed zakończeniem pisania. Masz kilka możliwości. Można słuchać pewnych wydarzeń na "Writsstream".

Z Dokumentów: https://nodejs.org/ Dist / Najnowsze-v12.x / Doksy / API / FSHTML # FS_FS_CREATEWRITESTREAM_PATH_OPTIONS

// Create WriteableStream
const writeableStream = fs.createWriteStream(`${title}.mp4`);

// Listening for the 'finish' event
writeableStream .on('finish', () => {
  console.log(`${item}/${length} - ${title} downloaded successfully`);
});

// Plug it into the ReadableStream
ytdl(videoUrl, {
    format: "mp4",
}).pipe(writeableStream);

Teraz spowoduje to utworzenie nowego pliku, gdy rozpocznie się pisanie. Proponuję użycie nazwy tymczasowej jak filename.temp.mp4, a następnie zmień nazwę po jej zakończeniu pisania.

1
Pascal Lamers 28 lipiec 2020, 11:09