From 8fe0a454357dbfff294b6a9766116803283c8d73 Mon Sep 17 00:00:00 2001 From: Michael C Date: Tue, 30 Nov 2021 18:58:37 -0500 Subject: [PATCH] add partial lookup --- src/routes/getSkipSegments.ts | 11 +++++++++-- src/types/segments.model.ts | 2 +- test/cases/getSkipSegments.ts | 21 +++++++++++++++++++++ test/cases/getSkipSegmentsByHash.ts | 25 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/routes/getSkipSegments.ts b/src/routes/getSkipSegments.ts index b8b0e71..82379fb 100644 --- a/src/routes/getSkipSegments.ts +++ b/src/routes/getSkipSegments.ts @@ -71,7 +71,7 @@ async function getSegmentsByVideoID(req: Request, videoID: VideoID, categories: const segmentsByCategory: SBRecord = (await getSegmentsFromDBByVideoID(videoID, service)) .filter((segment: DBSegment) => categories.includes(segment?.category) && actionTypes.includes(segment?.actionType)) .reduce((acc: SBRecord, segment: DBSegment) => { - if (requiredSegments.includes(segment.UUID)) segment.required = true; + if (filterRequiredSegments(segment.UUID, requiredSegments)) segment.required = true; acc[segment.category] ??= []; acc[segment.category].push(segment); @@ -110,7 +110,7 @@ async function getSegmentsByHash(req: Request, hashedVideoIDPrefix: VideoIDHash, hash: segment.hashedVideoID, segmentPerCategory: {} }; - if (requiredSegments.includes(segment.UUID)) segment.required = true; + if (filterRequiredSegments(segment.UUID, requiredSegments)) segment.required = true; acc[segment.videoID].segmentPerCategory[segment.category] ??= []; acc[segment.videoID].segmentPerCategory[segment.category].push(segment); @@ -373,6 +373,13 @@ async function handleGetSegments(req: Request, res: Response): Promise { + for (const search of requiredSegments) { + if (search === UUID || UUID.indexOf(search) == 0) return true; + } + return false; +}; + async function endpoint(req: Request, res: Response): Promise { try { const segments = await handleGetSegments(req, res); diff --git a/src/types/segments.model.ts b/src/types/segments.model.ts index e4a8375..a94bd8e 100644 --- a/src/types/segments.model.ts +++ b/src/types/segments.model.ts @@ -2,7 +2,7 @@ import { HashedValue } from "./hash.model"; import { SBRecord } from "./lib.model"; import { UserID } from "./user.model"; -export type SegmentUUID = string & { __segmentUUIDBrand: unknown }; +export type SegmentUUID = string & { __segmentUUIDBrand: unknown }; export type VideoID = string & { __videoIDBrand: unknown }; export type VideoDuration = number & { __videoDurationBrand: unknown }; export type Category = ("sponsor" | "selfpromo" | "interaction" | "intro" | "outro" | "preview" | "music_offtopic" | "poi_highlight" | "chapter") & { __categoryBrand: unknown }; diff --git a/test/cases/getSkipSegments.ts b/test/cases/getSkipSegments.ts index 9b1b38c..cf47098 100644 --- a/test/cases/getSkipSegments.ts +++ b/test/cases/getSkipSegments.ts @@ -26,6 +26,8 @@ describe("getSkipSegments", () => { await db.prepare("run", query, ["chapterVid", 60, 80, 2, 0, "chapterVid-1", "testman", 0, 50, "chapter", "chapter", "YouTube", 0, 0, 0, "Chapter 1"]); await db.prepare("run", query, ["chapterVid", 70, 75, 2, 0, "chapterVid-2", "testman", 0, 50, "chapter", "chapter", "YouTube", 0, 0, 0, "Chapter 2"]); await db.prepare("run", query, ["chapterVid", 71, 76, 2, 0, "chapterVid-3", "testman", 0, 50, "chapter", "chapter", "YouTube", 0, 0, 0, "Chapter 3"]); + await db.prepare("run", query, ["requiredSegmentHashVid", 10, 20, -2, 0, "1d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, 0, ""]); + await db.prepare("run", query, ["requiredSegmentHashVid", 20, 30, -2, 0, "1ebde8e8ae03096b6c866aa2c8cc7ee1d720ca1fca27bea3f39a6a1b876577e71", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, 0, ""]); return; }); @@ -426,4 +428,23 @@ describe("getSkipSegments", () => { }) .catch(err => done(err)); }); + + it("Should be able to get requiredSegment by partial", (done) => { + const required1 = "1d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa"; + const required2 = "1ebde8e8ae03096b6c866aa2c8cc7ee1d720ca1fca27bea3f39a6a1b876577e71"; + client.get(`${endpoint}?videoID=requiredSegmentHashVid&requiredSegment=${required1.slice(0,8)}&requiredSegment=${required2.slice(0,8)}`) + .then(res => { + assert.strictEqual(res.status, 200); + const data = res.data; + assert.strictEqual(data.length, 2); + const expected = [{ + UUID: required1, + }, { + UUID: required2, + }]; + assert.ok(partialDeepEquals(data, expected)); + done(); + }) + .catch(err => done(err)); + }); }); diff --git a/test/cases/getSkipSegmentsByHash.ts b/test/cases/getSkipSegmentsByHash.ts index 210008c..6716989 100644 --- a/test/cases/getSkipSegmentsByHash.ts +++ b/test/cases/getSkipSegmentsByHash.ts @@ -15,6 +15,7 @@ describe("getSkipSegmentsByHash", () => { const endpoint = "/api/skipSegments"; const getSegmentsByHash0Hash = "fdaff4dee1043451faa7398324fb63d8618ebcd11bddfe0491c488db12c6c910"; const requiredSegmentVidHash = "d51822c3f681e07aef15a8855f52ad12db9eb9cf059e65b16b64c43359557f61"; + const requiredSegmentHashVidHash = "17bf8d9090e050257772f8bff277293c29c7ce3b25eb969a8fae111a2434504d"; before(async () => { const query = 'INSERT INTO "sponsorTimes" ("videoID", "startTime", "endTime", "votes", "UUID", "userID", "timeSubmitted", views, category, "actionType", "service", "hidden", "shadowHidden", "hashedVideoID", "description") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; await db.prepare("run", query, ["getSegmentsByHash-0", 1, 10, 2, "getSegmentsByHash-01", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, getSegmentsByHash0Hash, ""]); @@ -41,6 +42,8 @@ describe("getSkipSegmentsByHash", () => { await db.prepare("run", query, ["longMuteVid-2-hash", 30, 35, 2, "longMuteVid-2-hash-2", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, getHash("longMuteVid-2-hash", 1), ""]); //ab0c await db.prepare("run", query, ["longMuteVid-2-hash", 2, 80, 2, "longMuteVid-2-hash-3", "testman", 0, 50, "sponsor", "mute", "YouTube", 0, 0, getHash("longMuteVid-2-hash", 1), ""]); //ab0c await db.prepare("run", query, ["longMuteVid-2-hash", 3, 78, 2, "longMuteVid-2-hash-4", "testman", 0, 50, "sponsor", "mute", "YouTube", 0, 0, getHash("longMuteVid-2-hash", 1), ""]); //ab0c + await db.prepare("run", query, ["requiredSegmentHashVid", 10, 20, -2, "fbf0af454059733c8822f6a4ac8ec568e0787f8c0a5ee915dd5b05e0d7a9a388", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, requiredSegmentHashVidHash, ""]); + await db.prepare("run", query, ["requiredSegmentHashVid", 20, 30, -2, "7e1ebc5194551d2d0a606d64f675e5a14952e4576b2959f8c9d51e316c14f8da", "testman", 0, 50, "sponsor", "skip", "YouTube", 0, 0, requiredSegmentHashVidHash, ""]); }); it("Should be able to get a 200", (done) => { @@ -478,4 +481,26 @@ describe("getSkipSegmentsByHash", () => { }) .catch(err => done(err)); }); + + it("Should be able to get specific segments with partial requiredSegments", (done) => { + const requiredSegment1 = "fbf0af454059733c8822f6a4ac8ec568e0787f8c0a5ee915dd5b05e0d7a9a388"; + const requiredSegment2 = "7e1ebc5194551d2d0a606d64f675e5a14952e4576b2959f8c9d51e316c14f8da"; + client.get(`${endpoint}/17bf?requiredSegments=["${requiredSegment1.slice(0,8)}","${requiredSegment2.slice(0,8)}"]`) + .then(res => { + assert.strictEqual(res.status, 200); + const data = res.data; + assert.strictEqual(data.length, 1); + const expected = [{ + segments: [{ + UUID: requiredSegment1 + }, { + UUID: requiredSegment2 + }] + }]; + assert.ok(partialDeepEquals(data, expected)); + assert.strictEqual(data[0].segments.length, 2); + done(); + }) + .catch(err => done(err)); + }); });