-
Notifications
You must be signed in to change notification settings - Fork 0
/
get-script.js
136 lines (119 loc) · 3.76 KB
/
get-script.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
const https = require("https")
const PODCAST_URLS = ['https://threads.out.airtime.pro/threads_b', 'https://threads2.out.airtime.pro/threads2_b'];
const PUBLIC_STATUS = [
'https://threads.airtime.pro/api/live-info-v2',
'https://threads2.airtime.pro/api/live-info-v2',
];
const STATION_NAME = "Threads";
const CHANNELS = ["Channel One", "Channel Two"];
const WEBSITE = "threadsradio.com";
const STATION_SLUG = "threadsradio";
const MAX_WAIT = 2000;
/**
* Kinda facade for an impatient get request.
*/
async function getRequestWithin(url, wait) {
return new Promise((resolve, reject) => {
const cancel = setTimeout(async () => {
req.destroy("TIME_OUT");
}, wait);
const req = https.get(url, res => {
let rawData = '';
res.on('data', chunk => {
rawData += chunk;
});
res.on('end', async () => {
try {
clearTimeout(cancel);
resolve(JSON.parse(rawData));
} catch (err) {
clearTimeout(cancel);
reject();
}
});
});
req.on('error', err => {
clearTimeout(cancel);
reject(err);
});
})
}
/**
* This is an interesting one.
* We just need to be sure of a SLOT id.
* (ie. user said Channel One or maybe said Main Channel,
* so we find and place the actual slot id, because that's constant,
* versus the value which can be any synonym);
*/
function confirmSlot(slot) {
return slot.resolutions.resolutionsPerAuthority.map((resolution) => {
return resolution.status.code === 'ER_SUCCESS_MATCH' && resolution.values[0].value.id
}).filter(el => el)[0]
}
/**
* Airtime returns some weird PHP encoding.
* So this helps me treat the show name to appear correctly.
*/
function unescapeHTML(safe) {
return safe.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/\(R\)/g, "from Repeats");
}
/**
* Get the juice before the sugar.
*/
async function getPlaybackInfo(who = 0) {
const promises = [];
const createPromise = (url) => new Promise(async (resolve, reject) => {
try {
const answer = await getRequestWithin(url, MAX_WAIT);
resolve(answer);
} catch (e) {
reject();
}
})
promises.push(createPromise(PUBLIC_STATUS[0]));
promises.push(createPromise(PUBLIC_STATUS[1]));
const response = { '0': 'an unknown stream', '1': 'an unknown stream' }
try {
const [response1, response2] = await Promise.allSettled(promises)
try {
if (response1.value && response1.value.station && response1.value.shows.current.name) {
const show = response1.value.shows.current.name;
response[0] = unescapeHTML(show);
} else if (response1.value && response1.value.station) {
response[0] = "Nothing";
} else {
response[0] = "a stream that was not identified in time by Alexa.";
}
} catch (e) {
response[0] = "a stream that was not identified in time by Alexa.";
console.log(e);
}
try {
if (response2.value && response2.value.station && response2.value.shows.current.name) {
const show = response2.value.shows.current.name;
response[1] = unescapeHTML(show);
} else if (response2.value && response2.value.station) {
response[1] = "Nothing";
} else {
response[1] = "a stream that was not identified in time by Alexa.";
}
} catch (e) {
response[1] = "a stream that was not identified in time by Alexa.";
console.log(e);
}
} catch (e) {
response[0] = `a stream that couldn't be figured by Alexa.`;
response[1] = `a stream that couldn't be figured by Alexa.`;
}
return response
}
const getThreadsData = async () => {
const info = await getPlaybackInfo()
console.log(info)
}
getThreadsData()