1 | #!/usr/bin/env node
|
2 | var programm = require('commander');
|
3 | var request = require('request');
|
4 | var fs = require('fs');
|
5 | var async = require('async');
|
6 | var util = require('util');
|
7 | var ProgressBar = require('progress');
|
8 | var multi = require('multimeter')(process);
|
9 | var google = require('./lib/providers/google');
|
10 | var iTunes = require('./lib/itunes');
|
11 |
|
12 | var DOWNLOAD_DIR = process.env.HOME + '/.gmsync-cache';
|
13 |
|
14 | programm
|
15 | .version(require('./package').version)
|
16 | .usage('[options]')
|
17 | .option('-p, --playlist [num]', 'Show playlist')
|
18 | .option('-d, --download', 'Download songs and sync with iTunes')
|
19 | .parse(process.argv);
|
20 |
|
21 | function getFileName(song) {
|
22 | return util.format('%s/%s — %s.mp3', DOWNLOAD_DIR, song.artist, song.title);
|
23 | }
|
24 | function downloadSong(song, cb) {
|
25 | var filename = getFileName(song);
|
26 | var unfinishedFilename = filename + '-part';
|
27 | google.getStreamUrl(song.storeId, function (err, url) {
|
28 | request(url)
|
29 | .on('response', function (res) {
|
30 | var length = Number(res.headers['content-length']);
|
31 | var total = 0;
|
32 | multi.drop({
|
33 | width: 20,
|
34 | before: filename + ' [',
|
35 | solid: {text: '#'},
|
36 | empty: {text: '-'}
|
37 | }, function (bar) {
|
38 | res.on('data', function (chunk) {
|
39 | total += chunk.length;
|
40 | bar.percent(total / length);
|
41 | });
|
42 | });
|
43 | })
|
44 | .pipe(fs.createWriteStream(unfinishedFilename))
|
45 | .on('error', console.error)
|
46 | .on('close', function () {
|
47 | fs.rename(unfinishedFilename, filename, cb);
|
48 | });
|
49 | });
|
50 | }
|
51 |
|
52 | function downloadSongs(playlist, cb) {
|
53 | try {
|
54 | fs.mkdirSync(DOWNLOAD_DIR);
|
55 | } catch (e) {};
|
56 | var playlistName = 'gm-' + playlist.name;
|
57 | /*
|
58 | var bar = new ProgressBar('Downloading [:bar] :percent :etas', {
|
59 | complete: '#',
|
60 | total: playlist.songs.length,
|
61 | width: 50
|
62 | });
|
63 | */
|
64 | iTunes.createPlaylist(playlistName);
|
65 | /*bar.tick(0);*/
|
66 |
|
67 | async.each(
|
68 | playlist.songs,
|
69 | function (song, cb) {
|
70 | var filename = getFileName(song);
|
71 | fs.readFile(filename, function (err) {
|
72 | if (!err) {
|
73 | iTunes.addFilenameToPlaylist(playlistName, filename, cb);
|
74 | /*return bar.tick();*/
|
75 | return;
|
76 | }
|
77 | downloadSong(song, function (err) {
|
78 | if (err) {
|
79 | return cb(err);
|
80 | }
|
81 | /*bar.tick();*/
|
82 | iTunes.addFilenameToPlaylist(playlistName, filename, cb);
|
83 | });
|
84 | });
|
85 | },
|
86 | cb
|
87 | );
|
88 | }
|
89 |
|
90 | function printSongs(playlist) {
|
91 | playlist.songs.forEach(function (item, index) {
|
92 | console.log('%s) %s — %s', index, item.artist, item.title);
|
93 | });
|
94 | }
|
95 |
|
96 | if (programm.playlist) {
|
97 | google.getPlayListWithSongs(programm.playlist, function (err, playlist) {
|
98 | if (err) {
|
99 | return console.error(err);
|
100 | }
|
101 | if (programm.download) {
|
102 | downloadSongs(playlist);
|
103 | } else {
|
104 | printSongs(playlist);
|
105 | }
|
106 | });
|
107 | } else {
|
108 | google.getPlayLists(function (err, playlists) {
|
109 | if (err) {
|
110 | return console.error(err);
|
111 | }
|
112 | console.log('Your playlists:');
|
113 | playlists.forEach(function (item, index) {
|
114 | console.log('%s) %s', index, item.name);
|
115 | });
|
116 | });
|
117 | }
|
118 |
|