| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import EventEmitter from 'events';
- import fs from 'fs';
- import ytdl from 'ytdl-core';
- import ffmpeg from 'fluent-ffmpeg';
-
- class Converter extends EventEmitter {
- constructor(url) {
- super();
- this.ytdl = null;
- this.totalSeconds = 0;
- ytdl.getInfo(url, {}, (err, info) => {
- if (err)
- this.emit('unavailable', err);
- else {
- this.totalSeconds = info ? info.length_seconds : 0;
- this.ytdl = ytdl(url);
- this.emit('available', info);
- }
- });
- }
- }
-
- export class VideoConverter extends Converter {
- constructor(url) { super(url); }
-
- initResponse(res, path) {
- const totalSize = res.headers['content-length'];
- let dataRead = 0;
- res.on('data', data => {
- dataRead += data.length;
- let percent = dataRead / totalSize;
- this.emit('progress', (percent * 100).toFixed(0));
- })
- .on('end', () => this.emit('end'))
- .on('error', () => fs.unlink(path, err => this.emit('error', error)));
- }
-
- download(path) {
- if (this.ytdl)
- this.ytdl.on('response', res => this.initResponse(res, path)).pipe(fs.createWriteStream(path));
- }
- }
-
- export class AudioConverter extends Converter {
- constructor(url) { super(url); }
-
- audio_percent(date) {
- const time = moment(new Date(...[0, 0, 0, ...date.split(':')]));
- const seconds = time.hours() * 3600 + time.minutes() * 60 + time.seconds();
- return ((seconds / this.totalSeconds) * 100).toFixed(0);
- }
-
- download(path) {
- if (this.ytdl)
- ffmpeg(this.ytdl)
- .noVideo().format('mp3')
- .output(fs.createWriteStream(path))
- .on('end', () => this.emit('end'))
- .on('start', () => this.emit('start'))
- .on('progress', params => this.emit('progress', this.audio_percent(params.timemark)))
- .on('error', (err, stdout, stderr) => fs.unlink(path, () => this.emit('error', err, stdout, stderr)))
- .run();
- }
- }
|