Parse user agent header

This commit is contained in:
Ajay Ramachandran
2021-07-31 21:49:10 -04:00
parent bdf0953f35
commit 8f0f01e6b2
4 changed files with 36 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ import { getReputation } from "../utils/reputation";
import { APIVideoData, APIVideoInfo } from "../types/youtubeApi.model"; import { APIVideoData, APIVideoInfo } from "../types/youtubeApi.model";
import { UserID } from "../types/user.model"; import { UserID } from "../types/user.model";
import { isUserVIP } from "../utils/isUserVIP"; import { isUserVIP } from "../utils/isUserVIP";
import { parseUserAgent } from "../utils/userAgent";
type CheckResult = { type CheckResult = {
pass: boolean, pass: boolean,
@@ -550,8 +551,7 @@ function preprocessInput(req: Request) {
} }
}); });
const userAgentAsArray = req.get("user-agent"); const userAgent = req.get("user-agent") ?? parseUserAgent(req.get("User-Agent")) ?? "";
const userAgent = userAgentAsArray || "";
return {videoID, userID, service, videoDuration, videoDurationParam, segments, userAgent}; return {videoID, userID, service, videoDuration, videoDurationParam, segments, userAgent};
} }

13
src/utils/userAgent.ts Normal file
View File

@@ -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 "";
}

View File

@@ -867,7 +867,7 @@ describe("postSkipSegments", () => {
const row = await db.prepare("get", `SELECT "startTime", "endTime", "locked", "category", "userAgent" FROM "sponsorTimes" WHERE "videoID" = ?`, ["userAgent-1"]); 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.startTime, 0);
assert.strictEqual(row.endTime, 10); assert.strictEqual(row.endTime, 10);
assert.strictEqual(row.userAgent, "MeaBot"); assert.strictEqual(row.userAgent, "MeaBot/5.0");
done(); done();
}) })
.catch(err => done(err)); .catch(err => done(err));

View File

@@ -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"));
});
});