1 | var PlayMusic = require('playmusic');
|
2 | var readline = require('readline-sync');
|
3 | var fs = require('fs');
|
4 | var pm = new PlayMusic();
|
5 |
|
6 | var HOME = process.env.HOME || process.env.USERPROFILE;
|
7 | var LOGIN_FILE = HOME + '/.gmsync';
|
8 | var loged = false;
|
9 |
|
10 | function requestPassword(cb) {
|
11 | var email = readline.question('Email: ');
|
12 | var password = readline.question('Password (' + email + '): ', {hideEchoBack: true, mask: ''});
|
13 | pm.login({
|
14 | email: email,
|
15 | password: password
|
16 | }, function (err, data) {
|
17 | if (err) {
|
18 | return cb(err);
|
19 | }
|
20 | var config = {gm: {auth: data}};
|
21 | fs.writeFileSync(LOGIN_FILE, JSON.stringify(config, null, 4));
|
22 | readFromCache(cb);
|
23 | });
|
24 | }
|
25 |
|
26 | function readFromCache(cb) {
|
27 | var config;
|
28 | try {
|
29 | config = fs.readFileSync(LOGIN_FILE);
|
30 | config = JSON.parse(config);
|
31 | } catch (e) {
|
32 | return cb(e);
|
33 | };
|
34 | if (!config.gm || !config.gm.auth) {
|
35 | return cb(new Error('No auth data'));
|
36 | }
|
37 | pm.init(config.gm.auth, cb);
|
38 | }
|
39 |
|
40 | function login(cb) {
|
41 | if (loged) {
|
42 | return cb(null);
|
43 | }
|
44 | readFromCache(function (err) {
|
45 | if (!err) {
|
46 | return cb(null);
|
47 | }
|
48 | requestPassword(function (err) {
|
49 | if (err) {
|
50 | return cb(err);
|
51 | }
|
52 | loged = true;
|
53 | cb(null);
|
54 | });
|
55 | });
|
56 | }
|
57 |
|
58 | function loginWrap(fn) {
|
59 | return function () {
|
60 | var args = arguments;
|
61 | var cb = args[args.length - 1];
|
62 | login(function (err) {
|
63 | if (err) {
|
64 | cb(err);
|
65 | }
|
66 | fn.apply(null, args);
|
67 | });
|
68 | };
|
69 | }
|
70 |
|
71 | function getPlayLists(cb) {
|
72 | pm.getPlayLists(function (err, response) {
|
73 | cb(err, !err && response.data.items);
|
74 | });
|
75 | }
|
76 |
|
77 | function getPlayListWithSongs(index, cb) {
|
78 | getPlayLists(function (err, playlists) {
|
79 | if (err) {
|
80 | return cb(err);
|
81 | }
|
82 | if (!playlists[index]) {
|
83 | return cb(new Error('No playlist with number ' + index));
|
84 | }
|
85 | var id = playlists[index].id;
|
86 | pm.getPlayListEntries(function (err, response) {
|
87 | if (err) {
|
88 | return cb(err);
|
89 | }
|
90 | var items = response.data.items
|
91 | .filter(function (item) {
|
92 | return item.playlistId === id;
|
93 | })
|
94 | .map(function (item) {
|
95 | return item.track;
|
96 | });
|
97 | var playlist = playlists[index];
|
98 | playlist.songs = items;
|
99 | cb(null, playlist);
|
100 | });
|
101 | });
|
102 | }
|
103 |
|
104 |
|
105 | module.exports = {
|
106 | getPlayLists: loginWrap(getPlayLists),
|
107 | getPlayListWithSongs: loginWrap(getPlayListWithSongs),
|
108 | getStreamUrl: pm.getStreamUrl.bind(pm)
|
109 | };
|