-
Notifications
You must be signed in to change notification settings - Fork 6
/
notifications.js
64 lines (54 loc) · 2.06 KB
/
notifications.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* global browser document MutationObserver */
var notifications = {
createNotificationObserver(trackInfo) {
return new MutationObserver(() => {
this.sendNotification(trackInfo);
});
},
getTrackData(trackInfo) {
const elements = trackInfo.querySelectorAll("a");
if (elements.length < 3) throw console.error("Not found correct track info");
const [image, track, ...artists] = elements;
const trackImage = image.querySelector(".now-playing__cover-art img").src;
const trackName = track.textContent;
const trackArtists = artists.map(e => e.textContent).join(", ");
return {
name: trackName,
artists: trackArtists,
image: trackImage
};
},
sendNotification(trackInfo) {
const data = this.getTrackData(trackInfo);
browser.runtime.sendMessage({ src: "spotifyNotifications.notification", data: data });
},
findTrackInfo() {
return new Promise(resolve => {
const observer = new MutationObserver((records, instance) => {
records.forEach(record => {
record.addedNodes.forEach(node => {
if (node.classList.contains("now-playing")) {
instance.disconnect();
resolve(node);
}
});
});
});
const body = document.querySelector("body");
observer.observe(body, { childList: true, subtree: true });
const nodes = body.querySelector(".now-playing");
if (nodes) {
observer.disconnect();
resolve(nodes);
}
});
},
run() {
this.findTrackInfo().then(trackInfo => {
this.notificationObserver = this.createNotificationObserver(trackInfo);
this.notificationObserver.observe(trackInfo, { characterData: true, subtree: true });
this.sendNotification(trackInfo);
});
}
};
notifications.run();