Advertisement
R4wizard

Untitled

Nov 27th, 2015
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. /*jslint node: true */
  2. "use strict";
  3.  
  4. var path = require('path');
  5. var request = require('request');
  6. var cheerio = require('cheerio');
  7. var ytdl = require('ytdl-core');
  8. var ffmpeg = require('fluent-ffmpeg');
  9. var rimraf = require('rimraf');
  10. var fs = require('fs');
  11.  
  12. class Radio_Source_YouTube {
  13. static getName() { return "YouTube"; }
  14.  
  15. static canHandle(uri) {
  16. let firstMatch = /https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9-_]+)/.test(uri);
  17. let secondMatch = /https?:\/\/(www\.)?youtu\.be\/([a-zA-Z0-9-_]+)/.test(uri);
  18. return firstMatch || secondMatch;
  19. }
  20.  
  21. static search(query, radio, callback) {
  22. callback(null, []);
  23. }
  24.  
  25. static metadata(uri, radio, callback) {
  26. request(uri, (err, response, body) => {
  27. if(err || response.statusCode != 200)
  28. return callback("unable to obtain page");
  29.  
  30. let $ = cheerio.load(body);
  31. let title = $('title').text().replace(/[\r\n]/g, "").trim();
  32. if(title.indexOf(" - YouTube") === -1)
  33. return callback("unable to obtain metadata from page");
  34.  
  35. let trackTitleArtist = radio.trackFromTitleString(title.replace(" - YouTube", ""));
  36. callback(null, {
  37. id : Date.now() + "_" + (Math.random() * 1000000000 | 0),
  38. name : trackTitleArtist[0],
  39. artist : trackTitleArtist[1]
  40. });
  41. });
  42. }
  43.  
  44. static download(uri, id, radio, callback) {
  45. let temporaryFileMP4 = path.join(radio.temporaryFolder, id + ".m4a");
  46. let temporaryFileMP3 = path.join(radio.temporaryFolder, id + ".mp3");
  47.  
  48. try {
  49. fs.accessSync("/home/node/ffmpeg/ffmpeg", fs.R_OK | fs.X_OK);
  50. process.env.FFMPEG_PATH = "/home/node/ffmpeg/ffmpeg";
  51. } catch (e) { }
  52.  
  53. ytdl(uri, {quality: [141, 140, "highest"]})
  54. .on('error', err => callback(err))
  55. .on('finish', () => {
  56. ffmpeg().input(temporaryFileMP4)
  57. .withNoVideo()
  58. .withAudioBitrate('256k')
  59. .withAudioChannels(2)
  60. .withAudioFrequency(48000)
  61. .withAudioQuality(5)
  62. .fromFormat('m4a')
  63. .toFormat('mp3')
  64. .save(temporaryFileMP3)
  65. .on('error', (err) => callback(err))
  66. .on('end', () => {
  67. rimraf(temporaryFileMP4, () => callback(null, true));
  68. });
  69. })
  70. .pipe(require('fs').createWriteStream(temporaryFileMP4));
  71. }
  72. }
  73.  
  74. module.exports = Radio_Source_YouTube;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement