-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstream.js
More file actions
49 lines (48 loc) · 2.09 KB
/
Copy pathstream.js
File metadata and controls
49 lines (48 loc) · 2.09 KB
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
import { UpstreamApiClient } from "../upstream/api-client.js";
import { validateStreamPageUrl, parseMatchPageUrl } from "../upstream/match-page-url.js";
import { buildSignedStreamUrl } from "../crypto/stream-token.js";
import { buildProxyUrl } from "../hls/proxy.js";
export async function resolveStream(pageUrl, origin) {
if (!pageUrl) return Response.json({ error: "url required" }, { status: 400 });
const validation = validateStreamPageUrl(pageUrl);
if (!validation.ok) return Response.json({ error: validation.error }, { status: 400 });
try {
const apiClient = new UpstreamApiClient();
const parsed = await parseMatchPageUrl(pageUrl, apiClient);
const pageContext = { pageReferer: parsed.pageReferer, pageOrigin: parsed.pageOrigin };
const streamContext = { pageReferer: parsed.playerReferer, pageOrigin: new URL(parsed.playerReferer).origin };
const geo = await apiClient.fetchUserGeo(pageContext);
const match = await apiClient.fetchMatchDetail(
{ matchId: parsed.matchId, sportType: parsed.sportType },
pageContext,
);
const stream = match.stream.find((item) => item.streamId);
if (!stream?.streamId) throw new Error("no stream on match");
if (stream.siteType == null) throw new Error("stream missing site type");
const detail = await apiClient.fetchStreamDetail(
{
streamId: stream.streamId,
matchId: parsed.matchId,
sportType: parsed.sportType,
siteType: stream.siteType,
streamSiteDigit: parsed.streamSiteDigit,
country: geo.country,
continent: geo.continent,
},
streamContext,
);
if (!detail.stream.url) throw new Error("stream detail missing url");
const streamUrl = buildSignedStreamUrl(detail.stream.url, detail.sessionToken);
return Response.json({
name: stream.name,
streamUrl,
referer: parsed.playerReferer,
playableUrl: buildProxyUrl(streamUrl, parsed.playerReferer, origin),
});
} catch (error) {
return Response.json(
{ error: error instanceof Error ? error.message : "resolve failed" },
{ status: 502 },
);
}
}