Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*jslint node: true */
- "use strict";
- var path = require('path');
- var request = require('request');
- var cheerio = require('cheerio');
- var ytdl = require('ytdl-core');
- var ffmpeg = require('fluent-ffmpeg');
- var rimraf = require('rimraf');
- var fs = require('fs');
- class Radio_Source_YouTube {
- static getName() { return "YouTube"; }
- static canHandle(uri) {
- let firstMatch = /https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9-_]+)/.test(uri);
- let secondMatch = /https?:\/\/(www\.)?youtu\.be\/([a-zA-Z0-9-_]+)/.test(uri);
- return firstMatch || secondMatch;
- }
- static search(query, radio, callback) {
- callback(null, []);
- }
- static metadata(uri, radio, callback) {
- request(uri, (err, response, body) => {
- if(err || response.statusCode != 200)
- return callback("unable to obtain page");
- let $ = cheerio.load(body);
- let title = $('title').text().replace(/[\r\n]/g, "").trim();
- if(title.indexOf(" - YouTube") === -1)
- return callback("unable to obtain metadata from page");
- let trackTitleArtist = radio.trackFromTitleString(title.replace(" - YouTube", ""));
- callback(null, {
- id : Date.now() + "_" + (Math.random() * 1000000000 | 0),
- name : trackTitleArtist[0],
- artist : trackTitleArtist[1]
- });
- });
- }
- static download(uri, id, radio, callback) {
- let temporaryFileMP4 = path.join(radio.temporaryFolder, id + ".m4a");
- let temporaryFileMP3 = path.join(radio.temporaryFolder, id + ".mp3");
- try {
- fs.accessSync("/home/node/ffmpeg/ffmpeg", fs.R_OK | fs.X_OK);
- process.env.FFMPEG_PATH = "/home/node/ffmpeg/ffmpeg";
- } catch (e) { }
- ytdl(uri, {quality: [141, 140, "highest"]})
- .on('error', err => callback(err))
- .on('finish', () => {
- ffmpeg().input(temporaryFileMP4)
- .withNoVideo()
- .withAudioBitrate('256k')
- .withAudioChannels(2)
- .withAudioFrequency(48000)
- .withAudioQuality(5)
- .fromFormat('m4a')
- .toFormat('mp3')
- .save(temporaryFileMP3)
- .on('error', (err) => callback(err))
- .on('end', () => {
- rimraf(temporaryFileMP4, () => callback(null, true));
- });
- })
- .pipe(require('fs').createWriteStream(temporaryFileMP4));
- }
- }
- module.exports = Radio_Source_YouTube;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement