-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
131 lines (100 loc) · 3.34 KB
/
server.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
const path = require("path");
const fs = require("fs");
const express = require("express");
const dotenv = require("dotenv");
dotenv.config();
const { PORT, CLIENT_ID, CLIENT_SECRET, CLIENT_SUBDOMAIN, OAUTH_ENDPOINT } =
process.env;
const app = express();
const port = PORT || 8080;
if (!CLIENT_ID || !CLIENT_SECRET || !CLIENT_SUBDOMAIN || !OAUTH_ENDPOINT) {
console.log("fill .env file");
return;
}
let accessTokenCached;
let accessTokenCacheExpiration;
async function getAccessToken() {
if (
accessTokenCached &&
accessTokenCacheExpiration &&
accessTokenCacheExpiration > new Date()
) {
console.log("cached token");
return accessTokenCached;
}
const urlSearchParams = new URLSearchParams();
urlSearchParams.set("client_id", CLIENT_ID);
urlSearchParams.set("client_secret", CLIENT_SECRET);
urlSearchParams.set("grant_type", "client_credentials");
const body = urlSearchParams.toString();
const reqTimestamp = new Date();
const response = await fetch(OAUTH_ENDPOINT, {
method: "POST",
body,
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});
const responseJson = await response.json();
const expirationSeconds = responseJson.expires_in;
accessTokenCacheExpiration = reqTimestamp.setSeconds(
reqTimestamp.getSeconds() + expirationSeconds
);
console.log({ expirationSeconds, accessTokenCacheExpiration });
accessTokenCached = responseJson.access_token;
return accessTokenCached;
}
async function getVods(token) {
const response = await fetch(
`https://${CLIENT_SUBDOMAIN}.api.videokit.cloud/vod/v1/assets?limit=5&page=1&sort=lastModificationDate&desc=true`,
{ headers: { authorization: `Bearer ${token}` } }
);
const { items } = await response.json();
return items;
}
function getFirstNonProtectedVod(vods) {
return vods.find((vod) =>
vod.outputs.find(
(output) =>
output.endpoints.every((endpoint) => endpoint.protection === "None") &&
output.endpoints.some((endpoint) => endpoint.format === "HLS")
)
);
}
function getHlsManifest(vod) {
return vod.outputs[0].endpoints.find(
(endpoint) => endpoint.accessType === "Http" && endpoint.format === "HLS"
)?.url;
}
app.get("/", async function (req, res) {
const index = fs.readFileSync(path.join(__dirname, "index.html"), {
encoding: "utf8",
});
return res.send(index);
});
app.get("/vod", async function (req, res) {
const accessToken = await getAccessToken();
const vods = await getVods(accessToken);
const nonProtectedVod = getFirstNonProtectedVod(vods);
const title = nonProtectedVod.title;
const hlsManifestUrl = getHlsManifest(nonProtectedVod);
let index = fs.readFileSync(path.join(__dirname, "vod.html"), {
encoding: "utf8",
});
if (hlsManifestUrl && title) {
index = index.replace("%HLS_MANIFEST_URL%", hlsManifestUrl);
index = index.replaceAll("%TITLE%", title);
}
return res.send(index);
});
app.get("/upload", async function (req, res) {
const accessToken = await getAccessToken();
let index = fs.readFileSync(path.join(__dirname, "upload.html"), {
encoding: "utf8",
});
if (accessToken) {
index = index.replace("%ACCESS_TOKEN%", accessToken);
index = index.replace("%CLIENT_SUBDOMAIN%", CLIENT_SUBDOMAIN);
}
return res.send(index);
});
app.listen(port);
console.log("Server started at http://localhost:" + port);