1 | 1 | 'use strict'; |
2 | | |
3 | 1 | var osascript = require('osascript').eval; |
4 | 1 | var stringify = require('js-function-string'); |
5 | 1 | var logSymbols = require('log-symbols'); |
6 | 1 | var chalk = require('chalk'); |
7 | 1 | var requireDir = require('require-dir'); |
8 | 1 | var lib = requireDir('./lib'); |
9 | 1 | var osascriptOpts = { |
10 | | flags: ['-s', 's'] |
11 | | }; |
12 | | |
13 | 1 | function startPlayback(callback) { |
14 | | // Run JavaScript file through OSA |
15 | 0 | osascript(stringify(lib.play.method), function (err) { |
16 | 0 | var result; |
17 | 0 | if (err === null) { |
18 | 0 | result = callback(logSymbols.success + ' Playing ♪♬'); |
19 | | } else { |
20 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
21 | | } |
22 | 0 | return result; |
23 | | }); |
24 | | } |
25 | | |
26 | 1 | function stopPlayback(callback) { |
27 | | // Run JavaScript file through OSA |
28 | 0 | osascript(stringify(lib.stop.method), function (err) { |
29 | 0 | var result; |
30 | 0 | if (err === null) { |
31 | 0 | result = callback(logSymbols.success + ' Stopped playing ♪♬'); |
32 | | } else { |
33 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
34 | | } |
35 | 0 | return result; |
36 | | }); |
37 | | } |
38 | | |
39 | 1 | function pausePlayback(callback) { |
40 | | // Run JavaScript file through OSA |
41 | 0 | osascript(stringify(lib.pause.method), function (err) { |
42 | 0 | var result; |
43 | 0 | if (err === null) { |
44 | 0 | result = callback(logSymbols.success + ' Paused playing ♪♬'); |
45 | | } else { |
46 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
47 | | } |
48 | 0 | return result; |
49 | | }); |
50 | | } |
51 | | |
52 | 1 | function nextTrack(callback) { |
53 | | // Run JavaScript file through OSA |
54 | 0 | osascript(stringify(lib.next.method), function (err) { |
55 | 0 | var result; |
56 | 0 | if (err === null) { |
57 | 0 | result = callback(logSymbols.success + ' Skipped track.'); |
58 | | } else { |
59 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
60 | | } |
61 | 0 | return result; |
62 | | }); |
63 | | } |
64 | | |
65 | 1 | function prevTrack(callback) { |
66 | | // Run JavaScript file through OSA |
67 | 0 | osascript(stringify(lib.previous.method), function (err) { |
68 | 0 | var result; |
69 | 0 | if (err === null) { |
70 | 0 | result = callback(logSymbols.success + ' Returned to previous track.'); |
71 | | } else { |
72 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
73 | | } |
74 | 0 | return result; |
75 | | }); |
76 | | } |
77 | | |
78 | 1 | function backTrack(callback) { |
79 | | // Run JavaScript file through OSA |
80 | 0 | osascript(stringify(lib.back.method), function (err) { |
81 | 0 | var result; |
82 | 0 | if (err === null) { |
83 | 0 | result = callback(logSymbols.success + ' Returned to previous track or beginning of current track'); |
84 | | } else { |
85 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
86 | | } |
87 | 0 | return result; |
88 | | }); |
89 | | } |
90 | | |
91 | 1 | function startPlaylist(playlist, amount, callback) { |
92 | | // Run JavaScript file through OSA |
93 | 0 | osascript(stringify(lib.play.method).replace(/{{playlist}}/, playlist), function (err) { |
94 | 0 | var result; |
95 | 0 | if (err === null) { |
96 | 0 | result = callback(logSymbols.success + ' Playing ' + amount + ' song(s) ♪♬'); |
97 | | } else { |
98 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
99 | | } |
100 | 0 | return result; |
101 | | }); |
102 | | } |
103 | | |
104 | 1 | function startSearch(searchTerm, opts, callback) { |
105 | 0 | var limitTo = 'all'; |
106 | 0 | var messagePart = 'songs, albums and artists containing ”'; |
107 | | |
108 | 0 | if (opts.songs) { |
109 | 0 | limitTo = 'songs'; |
110 | 0 | messagePart = 'songs containing ”'; |
111 | | } |
112 | 0 | if (opts.artists) { |
113 | 0 | limitTo = 'artists'; |
114 | 0 | messagePart = 'songs by ”'; |
115 | | } |
116 | 0 | if (opts.albums) { |
117 | 0 | limitTo = 'albums'; |
118 | 0 | messagePart = 'album containing ”'; |
119 | | } |
120 | | |
121 | | // Run JavaScript file through OSA |
122 | 0 | osascript(stringify(lib.search.method) |
123 | | .replace(/{{searchTerm}}/, searchTerm) |
124 | | .replace(/{{limitTo}}/, limitTo), osascriptOpts, function (err, data) { |
125 | 0 | data = JSON.parse(data); |
126 | 0 | var playlist = data[0]; |
127 | 0 | var amount = parseInt(data[1], 10); |
128 | 0 | var result; |
129 | 0 | if (err === null && amount) { |
130 | 0 | if (!opts.dontplay) { |
131 | 0 | startPlaylist(playlist, amount, function (response) { |
132 | 0 | result = callback(response); |
133 | | }); |
134 | | } |
135 | 0 | result = callback(logSymbols.success + ' Found ' + messagePart + |
136 | | chalk.inverse(searchTerm) + '“ and generated a temporary playlist'); |
137 | 0 | } else if (err === null) { |
138 | 0 | result = callback(logSymbols.error + ' Oops. Found 0 ' + messagePart + |
139 | | chalk.inverse(searchTerm) + '“.'); |
140 | | } else { |
141 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
142 | | } |
143 | 0 | return result; |
144 | | }); |
145 | | } |
146 | | |
147 | 1 | function getData(callback) { |
148 | | // Run JavaScript file through OSA |
149 | 0 | osascript(stringify(lib.getLibraryData.method), osascriptOpts, function (err, data) { |
150 | 0 | var result; |
151 | 0 | if (err === null) { |
152 | 0 | result = callback(data); |
153 | | } else { |
154 | 0 | result = callback(logSymbols.error + ' ' + chalk.red(err)); |
155 | | } |
156 | 0 | return result; |
157 | | }); |
158 | | } |
159 | | |
160 | 1 | module.exports = function (command, callback, args) { |
161 | 1 | switch (command) { |
162 | | case 'play': |
163 | 0 | startPlayback(function (response) { |
164 | 0 | return callback(response); |
165 | | }); |
166 | 0 | break; |
167 | | case 'stop': |
168 | 0 | stopPlayback(function (response) { |
169 | 0 | return callback(response); |
170 | | }); |
171 | 0 | break; |
172 | | case 'pause': |
173 | 0 | pausePlayback(function (response) { |
174 | 0 | return callback(response); |
175 | | }); |
176 | 0 | break; |
177 | | case 'next': |
178 | 0 | nextTrack(function (response) { |
179 | 0 | return callback(response); |
180 | | }); |
181 | 0 | break; |
182 | | case 'previous': |
183 | 0 | prevTrack(function (response) { |
184 | 0 | return callback(response); |
185 | | }); |
186 | 0 | break; |
187 | | case 'back': |
188 | 0 | backTrack(function (response) { |
189 | 0 | return callback(response); |
190 | | }); |
191 | 0 | break; |
192 | | case 'search': |
193 | 0 | startSearch(args.searchterm, args.options, function (response) { |
194 | 0 | return callback(response); |
195 | | }); |
196 | 0 | break; |
197 | | case 'getData': |
198 | 0 | getData(function (response) { |
199 | 0 | return callback(response); |
200 | | }); |
201 | 0 | break; |
202 | | default: |
203 | 1 | throw new Error('You have to call itunesRemote with a command'); |
204 | | } |
205 | | }; |
206 | | |