UNPKG

2.89 kBPlain TextView Raw
1#!/usr/bin/env node
2var programm = require('commander');
3var request = require('request');
4var fs = require('fs');
5var async = require('async');
6var util = require('util');
7var ProgressBar = require('progress');
8var multi = require('multimeter')(process);
9var google = require('./lib/providers/google');
10var iTunes = require('./lib/itunes');
11
12var DOWNLOAD_DIR = process.env.HOME + '/.gmsync-cache';
13
14programm
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
21function getFileName(song) {
22 return util.format('%s/%s — %s.mp3', DOWNLOAD_DIR, song.artist, song.title);
23}
24function 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
52function 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
90function printSongs(playlist) {
91 playlist.songs.forEach(function (item, index) {
92 console.log('%s) %s — %s', index, item.artist, item.title);
93 });
94}
95
96if (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