UNPKG

2.21 kBJavaScriptView Raw
1var EventEmitter = require('events').EventEmitter;
2var async = require('async');
3var request = require('request');
4var iTunes = require('itunes-control');
5var fs = require('fs');
6var util = require('util');
7var google = require('./providers/google');
8
9var MAX_DOWNLOADS_PER_TIME = 10;
10var DOWNLOAD_DIR = process.env.HOME + '/.gmsync-cache';
11var isWin = /win/.test(process.platform);
12
13function downloadPlalist(songs, path, name) {
14 var ee = new EventEmitter();
15 var playlistName = 'gm-' + name;
16 var downloadDir = path ?
17 (path + '/' + name.replace(/[\/\\]/g, '_')).replace(/\/+/g, '/') :
18 DOWNLOAD_DIR;
19
20 function downloadSong(song, cb) {
21 var filename = getFileName(song);
22 var unfinishedFilename = filename + '-part';
23 google.getStreamUrl(song.storeId, function (err, url) {
24 request(url)
25 .pipe(fs.createWriteStream(unfinishedFilename))
26 .on('error', function (err) {
27 console.error('Error while downloading', err)
28 })
29 .on('close', function () {
30 fs.rename(unfinishedFilename, filename, cb);
31 });
32 });
33 }
34
35 function getFileName(song) {
36 var title = song.title.replace(/\//g, '-').replace(/"/g, '\'');
37 return util.format('%s/%s — %s.mp3', downloadDir, song.artist, title);
38 }
39
40 function task(song, cb) {
41 var filename = getFileName(song);
42 fs.readFile(filename, function (err) {
43 function add() {
44 if (isWin) {
45 ee.emit('item');
46 cb();
47 return;
48 }
49 return iTunes.addToPlaylist(playlistName, filename, function (err) {
50 if (err) {
51 return setTimeout(add, 1000);
52 }
53 ee.emit('item');
54 cb();
55 });
56 }
57 if (!err) {
58 return add();
59 }
60 downloadSong(song, function (err) {
61 if (err) {
62 return cb(err);
63 }
64 add();
65 });
66 });
67 }
68
69 try {
70 fs.mkdirSync(downloadDir);
71 } catch (e) {
72 console.log(e);
73 if (e.code === 'ENOENT') {
74 console.error('\n\nNo such directory "%s"\n', path);
75 return ee;
76 }
77 };
78
79 function load() {
80 async.eachLimit(songs, MAX_DOWNLOADS_PER_TIME, task, function (err) {
81 if (err) {
82 return console.error(err);
83 }
84 ee.emit('end');
85 });
86 }
87
88 if (isWin) {
89 load();
90 } else {
91 iTunes.createPlaylist(playlistName, load);
92 }
93
94 return ee;
95
96}
97
98module.exports = downloadPlalist;