mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-14 23:47:00 +03:00
Fix non-sequencial reputation in getSkipSegments
This commit is contained in:
@@ -39,7 +39,7 @@ async function prepareCategorySegments(req: Request, videoID: VideoID, service:
|
|||||||
|
|
||||||
const ipList = cache.shadowHiddenSegmentIPs[videoID][segment.timeSubmitted];
|
const ipList = cache.shadowHiddenSegmentIPs[videoID][segment.timeSubmitted];
|
||||||
|
|
||||||
if (ipList?.length > 0 && cache.userHashedIP === undefined && cache.userHashedIPPromise) {
|
if (ipList?.length > 0 && cache.userHashedIP === undefined) {
|
||||||
cache.userHashedIP = await cache.userHashedIPPromise;
|
cache.userHashedIP = await cache.userHashedIPPromise;
|
||||||
}
|
}
|
||||||
//if this isn't their ip, don't send it to them
|
//if this isn't their ip, don't send it to them
|
||||||
@@ -278,6 +278,9 @@ async function chooseSegments(videoID: VideoID, service: Service, segments: DBSe
|
|||||||
//This allows new less voted items to still sometimes appear to give them a chance at getting votes.
|
//This allows new less voted items to still sometimes appear to give them a chance at getting votes.
|
||||||
//Segments with less than -1 votes are already ignored before this function is called
|
//Segments with less than -1 votes are already ignored before this function is called
|
||||||
async function buildSegmentGroups(segments: DBSegment[]): Promise<OverlappingSegmentGroup[]> {
|
async function buildSegmentGroups(segments: DBSegment[]): Promise<OverlappingSegmentGroup[]> {
|
||||||
|
const reputationPromises = segments.map(segment =>
|
||||||
|
segment.userID ? getReputation(segment.userID) : null);
|
||||||
|
|
||||||
//Create groups of segments that are similar to eachother
|
//Create groups of segments that are similar to eachother
|
||||||
//Segments must be sorted by their startTime so that we can build groups chronologically:
|
//Segments must be sorted by their startTime so that we can build groups chronologically:
|
||||||
//1. As long as the segments' startTime fall inside the currentGroup, we keep adding them to that group
|
//1. As long as the segments' startTime fall inside the currentGroup, we keep adding them to that group
|
||||||
@@ -286,7 +289,8 @@ async function buildSegmentGroups(segments: DBSegment[]): Promise<OverlappingSeg
|
|||||||
let overlappingSegmentsGroups: OverlappingSegmentGroup[] = [];
|
let overlappingSegmentsGroups: OverlappingSegmentGroup[] = [];
|
||||||
let currentGroup: OverlappingSegmentGroup;
|
let currentGroup: OverlappingSegmentGroup;
|
||||||
let cursor = -1; //-1 to make sure that, even if the 1st segment starts at 0, a new group is created
|
let cursor = -1; //-1 to make sure that, even if the 1st segment starts at 0, a new group is created
|
||||||
await Promise.all(segments.map(async (segment) => {
|
for (let i = 0; i < segments.length; i++) {
|
||||||
|
const segment = segments[i];
|
||||||
if (segment.startTime >= cursor) {
|
if (segment.startTime >= cursor) {
|
||||||
currentGroup = { segments: [], votes: 0, reputation: 0, locked: false, required: false };
|
currentGroup = { segments: [], votes: 0, reputation: 0, locked: false, required: false };
|
||||||
overlappingSegmentsGroups.push(currentGroup);
|
overlappingSegmentsGroups.push(currentGroup);
|
||||||
@@ -298,7 +302,7 @@ async function buildSegmentGroups(segments: DBSegment[]): Promise<OverlappingSeg
|
|||||||
currentGroup.votes += segment.votes;
|
currentGroup.votes += segment.votes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (segment.userID) segment.reputation = Math.min(segment.reputation, await getReputation(segment.userID));
|
if (segment.userID) segment.reputation = Math.min(segment.reputation, await reputationPromises[i]);
|
||||||
if (segment.reputation > 0) {
|
if (segment.reputation > 0) {
|
||||||
currentGroup.reputation += segment.reputation;
|
currentGroup.reputation += segment.reputation;
|
||||||
}
|
}
|
||||||
@@ -312,7 +316,7 @@ async function buildSegmentGroups(segments: DBSegment[]): Promise<OverlappingSeg
|
|||||||
}
|
}
|
||||||
|
|
||||||
cursor = Math.max(cursor, segment.endTime);
|
cursor = Math.max(cursor, segment.endTime);
|
||||||
}));
|
}
|
||||||
|
|
||||||
overlappingSegmentsGroups = splitPercentOverlap(overlappingSegmentsGroups);
|
overlappingSegmentsGroups = splitPercentOverlap(overlappingSegmentsGroups);
|
||||||
overlappingSegmentsGroups.forEach((group) => {
|
overlappingSegmentsGroups.forEach((group) => {
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf`, { params: { categories: `["sponsor","intro"]` } })
|
client.get(`${endpoint}/fdaf`, { params: { categories: `["sponsor","intro"]` } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 2);
|
assert.strictEqual(data.length, 2);
|
||||||
assert.strictEqual(data[0].segments.length, 2);
|
assert.strictEqual(data[0].segments.length, 2);
|
||||||
assert.strictEqual(data[1].segments.length, 1);
|
assert.strictEqual(data[1].segments.length, 1);
|
||||||
@@ -163,15 +163,15 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf`)
|
client.get(`${endpoint}/fdaf`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
category: "sponsor",
|
category: "sponsor",
|
||||||
UUID: "getSegmentsByHash-01",
|
UUID: "getSegmentsByHash-01"
|
||||||
}]
|
}]
|
||||||
}, {
|
}, {
|
||||||
segments: [{
|
segments: [{
|
||||||
category: "sponsor",
|
category: "sponsor"
|
||||||
}]
|
}]
|
||||||
}];
|
}];
|
||||||
assert.strictEqual(data.length, 2);
|
assert.strictEqual(data.length, 2);
|
||||||
@@ -187,7 +187,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf`, { params: { actionType: "skip" } })
|
client.get(`${endpoint}/fdaf`, { params: { actionType: "skip" } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 2);
|
assert.strictEqual(data.length, 2);
|
||||||
assert.strictEqual(data[0].segments.length, 1);
|
assert.strictEqual(data[0].segments.length, 1);
|
||||||
assert.strictEqual(data[1].segments.length, 1);
|
assert.strictEqual(data[1].segments.length, 1);
|
||||||
@@ -211,7 +211,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf?actionType=skip&actionType=mute`)
|
client.get(`${endpoint}/fdaf?actionType=skip&actionType=mute`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 2);
|
assert.strictEqual(data.length, 2);
|
||||||
assert.strictEqual(data[0].segments.length, 2);
|
assert.strictEqual(data[0].segments.length, 2);
|
||||||
assert.strictEqual(data[1].segments.length, 1);
|
assert.strictEqual(data[1].segments.length, 1);
|
||||||
@@ -237,7 +237,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf?actionTypes=["skip","mute"]`)
|
client.get(`${endpoint}/fdaf?actionTypes=["skip","mute"]`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 2);
|
assert.strictEqual(data.length, 2);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -261,7 +261,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaf`, { params: { service: "PeerTube" } })
|
client.get(`${endpoint}/fdaf`, { params: { service: "PeerTube" } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -279,7 +279,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/c962`, { params: { category: "poi_highlight", actionType: "poi" } })
|
client.get(`${endpoint}/c962`, { params: { category: "poi_highlight", actionType: "poi" } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
assert.strictEqual(data[0].segments.length, 1);
|
assert.strictEqual(data[0].segments.length, 1);
|
||||||
assert.strictEqual(data[0].segments[0].category, "poi_highlight");
|
assert.strictEqual(data[0].segments[0].category, "poi_highlight");
|
||||||
@@ -293,7 +293,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/c962`, { params: { category: "poi_highlight" } })
|
client.get(`${endpoint}/c962`, { params: { category: "poi_highlight" } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
assert.strictEqual(data[0].segments.length, 1);
|
assert.strictEqual(data[0].segments.length, 1);
|
||||||
assert.strictEqual(data[0].segments[0].category, "poi_highlight");
|
assert.strictEqual(data[0].segments[0].category, "poi_highlight");
|
||||||
@@ -317,7 +317,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/${getHash(testID, 1).substring(0, 3)}`)
|
client.get(`${endpoint}/${getHash(testID, 1).substring(0, 3)}`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -337,7 +337,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/fdaff4?&category=sponsor&category=intro`)
|
client.get(`${endpoint}/fdaff4?&category=sponsor&category=intro`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -360,7 +360,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/d518?requiredSegments=["requiredSegmentVid-2","requiredSegmentVid-3"]`)
|
client.get(`${endpoint}/d518?requiredSegments=["requiredSegmentVid-2","requiredSegmentVid-3"]`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -380,7 +380,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/d518?requiredSegment=requiredSegmentVid-2&requiredSegment=requiredSegmentVid-3`)
|
client.get(`${endpoint}/d518?requiredSegment=requiredSegmentVid-2&requiredSegment=requiredSegmentVid-3`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
assert.strictEqual(data[0].segments.length, 2);
|
assert.strictEqual(data[0].segments.length, 2);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
@@ -400,7 +400,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/7258?category=chapter&actionType=chapter`)
|
client.get(`${endpoint}/7258?category=chapter&actionType=chapter`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -432,7 +432,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/6613?actionType=skip&actionType=mute`)
|
client.get(`${endpoint}/6613?actionType=skip&actionType=mute`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -490,7 +490,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/3061?categories=["sponsor","music_offtopic"]`)
|
client.get(`${endpoint}/3061?categories=["sponsor","music_offtopic"]`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -510,7 +510,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/ab0c?actionType=skip&actionType=mute`)
|
client.get(`${endpoint}/ab0c?actionType=skip&actionType=mute`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
@@ -551,7 +551,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/278f`, { params: { category: ["sponsor", "selfpromo"], actionType: "full" } })
|
client.get(`${endpoint}/278f`, { params: { category: ["sponsor", "selfpromo"], actionType: "full" } })
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
assert.strictEqual(data[0].segments.length, 1);
|
assert.strictEqual(data[0].segments.length, 1);
|
||||||
assert.strictEqual(data[0].segments[0].category, "selfpromo");
|
assert.strictEqual(data[0].segments[0].category, "selfpromo");
|
||||||
@@ -566,7 +566,7 @@ describe("getSkipSegmentsByHash", () => {
|
|||||||
client.get(`${endpoint}/17bf?requiredSegments=["${requiredSegment1.slice(0,8)}","${requiredSegment2.slice(0,8)}"]`)
|
client.get(`${endpoint}/17bf?requiredSegments=["${requiredSegment1.slice(0,8)}","${requiredSegment2.slice(0,8)}"]`)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
assert.strictEqual(res.status, 200);
|
assert.strictEqual(res.status, 200);
|
||||||
const data = res.data;
|
const data = (res.data as Array<any>).sort((a, b) => a.videoID.localeCompare(b.videoID));
|
||||||
assert.strictEqual(data.length, 1);
|
assert.strictEqual(data.length, 1);
|
||||||
const expected = [{
|
const expected = [{
|
||||||
segments: [{
|
segments: [{
|
||||||
|
|||||||
Reference in New Issue
Block a user