UNPKG

2.83 kBJavaScriptView Raw
1var PlayMusic = require('playmusic');
2var readline = require('readline-sync');
3var fs = require('fs');
4var pm = new PlayMusic();
5
6var HOME = process.env.HOME || process.env.USERPROFILE;
7var LOGIN_FILE = HOME + '/.gmsync';
8var loged = false;
9
10function 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
26function 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
40function 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
58function 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
71function getPlayLists(cb) {
72 pm.getPlayLists(function (err, response) {
73 cb(err, !err && response.data.items);
74 });
75}
76
77function 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 .filter(Boolean);
98 var playlist = playlists[index];
99 playlist.songs = items; // oh really? what about side effects?
100 cb(null, playlist);
101 });
102 });
103}
104
105function search(text, cb) {
106 pm.search(text, 20, function (err, response) {
107 if (err) {
108 return cb(err);
109 }
110 var items = response.entries
111 .sort(function (a, b) {
112 return a.score < b.score;
113 })
114 .map(function (item) {
115 return item.track;
116 })
117 .filter(Boolean);
118
119 cb(null, {
120 name: text.toLowerCase(),
121 songs: items
122 });
123 });
124}
125function favorites(cb) {
126 pm.getFavotites(function (err, data) {
127 cb(err, data && data.track);
128 });
129}
130
131module.exports = {
132 getPlayLists: loginWrap(getPlayLists),
133 getPlayListWithSongs: loginWrap(getPlayListWithSongs),
134 search: loginWrap(search),
135 getStreamUrl: pm.getStreamUrl.bind(pm),
136 favorites: loginWrap(favorites)
137};