Skip to content

Commit 9db5a90

Browse files
committed
Add demo Node application
1 parent 4f34b16 commit 9db5a90

File tree

2 files changed

+126
-1
lines changed

2 files changed

+126
-1
lines changed

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ To build updated JavaScript files for browser use in `dist/`, run:
7373
yarn build
7474
```
7575

76-
## Demo application
76+
## Demo web application
7777

7878
![Web demo](examples/web.png)
7979

@@ -103,6 +103,29 @@ application files, `examples/web.{html,js}`, will instantly be visible in
103103
your browser. Thus, this can serve as a nice playing ground to get to know
104104
the capabilities of Mopidy and Mopidy.js.
105105

106+
## Demo console application
107+
108+
In the `examples/` directory of the Gir repo, you can find `mpc.js`, a partial
109+
clone of the `mpc` utility built using Mopidy.js on Node.
110+
111+
Output from the original command:
112+
113+
```
114+
$ mpc
115+
Jon Hopkins - C O S M
116+
[playing] #6/12 2:33/7:08 (35%)
117+
volume:100% repeat: off random: on single: off consume: off
118+
```
119+
120+
Output from the `mpc.js` example:
121+
122+
```
123+
$ ./examples/mpc.js
124+
Jon Hopkins - C O S M
125+
[playing] #6/- 2:33/7:08 (36%)
126+
volume:100% repeat: off random: on single: off consume: off
127+
```
128+
106129
## Changelog
107130

108131
See [CHANGELOG.md](CHANGELOG.md).

examples/mpc.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#!/usr/bin/env node
2+
3+
/* eslint-env node */
4+
/* eslint-disable no-console */
5+
6+
/*
7+
Output when offline:
8+
9+
WebSocket error: ...
10+
11+
Output when not playing:
12+
13+
volume:100% repeat: off random: on single: off consume: off
14+
15+
Output when playing:
16+
17+
Kiasmos - Shed
18+
[playing] #9/14 0:26/5:35 (7%)
19+
volume:100% repeat: off random: on single: off consume: off
20+
*/
21+
22+
const Mopidy = require("../mopidy");
23+
24+
const mopidy = new Mopidy({
25+
autoConnect: false,
26+
webSocketUrl: "ws://localhost:6680/mopidy/ws",
27+
});
28+
29+
function renderTrackNumber(track) {
30+
return `#${track.track_no}/${track.album.num_tracks || "-"}`;
31+
}
32+
33+
function renderTime(timeInSeconds) {
34+
const minutes = Math.floor(timeInSeconds / 1000 / 60);
35+
const seconds = Math.floor((timeInSeconds / 1000) % 60)
36+
.toString()
37+
.padStart(2, "0");
38+
return `${minutes}:${seconds}`;
39+
}
40+
41+
function renderPosition(track, timePosition) {
42+
const pos = renderTime(timePosition);
43+
const length = renderTime(track.length);
44+
const percentage = Math.floor((timePosition * 100) / track.length);
45+
return `${pos}/${length} (${percentage}%)`;
46+
}
47+
48+
async function showPlaybackInfo() {
49+
const trackPromise = mopidy.playback.getCurrentTrack();
50+
const statePromise = mopidy.playback.getState();
51+
const timePositionPromise = mopidy.playback.getTimePosition();
52+
53+
const track = await trackPromise;
54+
const state = await statePromise;
55+
const timePosition = await timePositionPromise;
56+
57+
if (state === "stopped") {
58+
return;
59+
}
60+
61+
const artists = track.artists.map(a => a.name).join(", ");
62+
console.log(`${artists} - ${track.name}`);
63+
console.log(
64+
`[${state}] ${renderTrackNumber(track)} ` +
65+
`${renderPosition(track, timePosition)}`
66+
);
67+
}
68+
69+
async function showTracklistInfo() {
70+
const volumePromise = mopidy.mixer.getVolume();
71+
const repeatPromise = mopidy.tracklist.getRepeat();
72+
const randomPromise = mopidy.tracklist.getRandom();
73+
const singlePromise = mopidy.tracklist.getSingle();
74+
const consumePromise = mopidy.tracklist.getConsume();
75+
76+
const volume = (await volumePromise).toString().padStart(3, " ");
77+
const repeat = ((await repeatPromise) && "on ") || "off";
78+
const random = ((await randomPromise) && "on ") || "off";
79+
const single = ((await singlePromise) && "on ") || "off";
80+
const consume = ((await consumePromise) && "on ") || "off";
81+
82+
console.log(
83+
`volume:${volume}% ` +
84+
`repeat: ${repeat} ` +
85+
`random: ${random} ` +
86+
`single: ${single} ` +
87+
`consume: ${consume}`
88+
);
89+
}
90+
91+
mopidy.on("state:online", async () => {
92+
await showPlaybackInfo();
93+
await showTracklistInfo();
94+
process.exit();
95+
});
96+
97+
mopidy.on("websocket:error", error => {
98+
console.log(`WebSocket error: ${error.message}`);
99+
process.exit(1);
100+
});
101+
102+
mopidy.connect();

0 commit comments

Comments
 (0)