diff --git a/src/routes/postSkipSegments.ts b/src/routes/postSkipSegments.ts index 31c0749..97117f8 100644 --- a/src/routes/postSkipSegments.ts +++ b/src/routes/postSkipSegments.ts @@ -18,6 +18,7 @@ import { getReputation } from "../utils/reputation"; import { APIVideoData, APIVideoInfo } from "../types/youtubeApi.model"; import { UserID } from "../types/user.model"; import { isUserVIP } from "../utils/isUserVIP"; +import { parseUserAgent } from "../utils/userAgent"; type CheckResult = { pass: boolean, @@ -550,8 +551,7 @@ function preprocessInput(req: Request) { } }); - const userAgentAsArray = req.get("user-agent"); - const userAgent = userAgentAsArray || ""; + const userAgent = req.get("user-agent") ?? parseUserAgent(req.get("User-Agent")) ?? ""; return {videoID, userID, service, videoDuration, videoDurationParam, segments, userAgent}; } diff --git a/src/utils/userAgent.ts b/src/utils/userAgent.ts new file mode 100644 index 0000000..f9c2410 --- /dev/null +++ b/src/utils/userAgent.ts @@ -0,0 +1,13 @@ +export function parseUserAgent(userAgent: string): string { + const ua = userAgent.toLowerCase(); + + if (ua.includes("com.google.android.youtube/") || ua.includes("com.vanced.android.youtube/")) { + return `Vanced/${ua.match(/.android.youtube\/([^\s]+)/)[1]}`; + } + + if (ua.includes("mpv_sponsorblock/")) { + return ua; + } + + return ""; +} \ No newline at end of file diff --git a/test/cases/postSkipSegments.ts b/test/cases/postSkipSegments.ts index f19ba34..5a843f8 100644 --- a/test/cases/postSkipSegments.ts +++ b/test/cases/postSkipSegments.ts @@ -867,7 +867,7 @@ describe("postSkipSegments", () => { const row = await db.prepare("get", `SELECT "startTime", "endTime", "locked", "category", "userAgent" FROM "sponsorTimes" WHERE "videoID" = ?`, ["userAgent-1"]); assert.strictEqual(row.startTime, 0); assert.strictEqual(row.endTime, 10); - assert.strictEqual(row.userAgent, "MeaBot"); + assert.strictEqual(row.userAgent, "MeaBot/5.0"); done(); }) .catch(err => done(err)); diff --git a/test/cases/userAgentTest.ts b/test/cases/userAgentTest.ts new file mode 100644 index 0000000..6bc91ef --- /dev/null +++ b/test/cases/userAgentTest.ts @@ -0,0 +1,20 @@ +import assert from "assert"; +import { parseUserAgent } from "../../src/utils/userAgent"; + +describe("userAgent", () => { + it ("Works for Vanced package", () => { + assert.strictEqual("Vanced/1521081792", parseUserAgent("com.vanced.android.youtube/1521081792 (Linux; U; Android 10)")); + }); + + it ("Works for Android package (root)", () => { + assert.strictEqual("Vanced/1521081792", parseUserAgent("com.google.android.youtube/1521081792 (Linux; U; Android 10)")); + }); + + it ("Works MPV", () => { + assert.strictEqual("mpv_sponsorblock/1.0 (https://github.com/po5/mpv_sponsorblock)", parseUserAgent("mpv_sponsorblock/1.0 (https://github.com/po5/mpv_sponsorblock)")); + }); + + it ("Blank for anything else", () => { + assert.strictEqual("", parseUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36")); + }); +}); \ No newline at end of file