Skip to content

Commit 9753b7c

Browse files
committed
Merge branch 'master' of https://github.com/ajayyy/SponsorBlock
2 parents 40eabe6 + 9a526c5 commit 9753b7c

19 files changed

Lines changed: 1278 additions & 3515 deletions

package-lock.json

Lines changed: 1035 additions & 3358 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"ts-loader": "^9.4.2",
3939
"ts-node": "^10.9.1",
4040
"typescript": "4.9",
41-
"web-ext": "^8.2.0",
41+
"web-ext": "^8.9.0",
4242
"webpack": "^5.94.0",
4343
"webpack-cli": "^4.10.0",
4444
"webpack-merge": "^5.8.0"

src/background.ts

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as CompileConfig from "../config.json";
33
import Config from "./config";
44
import { Registration } from "./types";
55
import "content-scripts-register-polyfill";
6-
import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
6+
import { sendRealRequestToCustomServer, serializeOrStringify, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
77
import { setupTabUpdates } from "../maze-utils/src/tab-updates";
88
import { generateUserID } from "../maze-utils/src/setup";
99

@@ -227,33 +227,16 @@ async function submitVote(type: number, UUID: string, category: string, videoID:
227227

228228
try {
229229
const response = await asyncRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&videoID=" + videoID + "&userID=" + userID + typeSection);
230-
231-
if (response.ok) {
232-
return {
233-
successType: 1,
234-
responseText: await response.text()
235-
};
236-
} else if (response.status == 405) {
237-
//duplicate vote
238-
return {
239-
successType: 0,
240-
statusCode: response.status,
241-
responseText: await response.text()
242-
};
243-
} else {
244-
//error while connect
245-
return {
246-
successType: -1,
247-
statusCode: response.status,
248-
responseText: await response.text()
249-
};
250-
}
230+
231+
return {
232+
status: response.status,
233+
ok: response.ok,
234+
responseText: await response.text(),
235+
};
251236
} catch (e) {
252-
console.error(e);
237+
console.error("Error while voting:", e);
253238
return {
254-
successType: -1,
255-
statusCode: -1,
256-
responseText: ""
239+
error: serializeOrStringify(e),
257240
};
258241
}
259242
}
@@ -263,4 +246,4 @@ async function asyncRequestToServer(type: string, address: string, data = {}) {
263246
const serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
264247

265248
return await (sendRealRequestToCustomServer(type, serverAddress + address, data));
266-
}
249+
}

src/components/CategoryPillComponent.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
88
import { VoteResponse } from "../messageTypes";
99
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1010
import { Tooltip } from "../render/Tooltip";
11-
import { getErrorMessage } from "../../maze-utils/src/formating";
11+
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
12+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1213

1314
export interface CategoryPillProps {
1415
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -127,15 +128,19 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
127128
const response = await this.props.vote(type, this.state.segment.UUID);
128129
await stopAnimation();
129130

130-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
131+
if ("error" in response) {
132+
console.error("[SB] Caught error while attempting to vote on a FV label", response.error);
133+
alert(formatJSErrorMessage(response.error));
134+
} else if (response.ok || response.status === 429) {
131135
this.setState({
132136
open: false,
133137
show: type === 1
134138
});
135139

136140
this.closeTooltip();
137-
} else if (response.statusCode !== 403) {
138-
alert(getErrorMessage(response.statusCode, response.responseText));
141+
} else if (response.status !== 403) {
142+
logRequest({headers: null, ...response}, "SB", "vote on FV label");
143+
alert(getLongErrorMessage(response.status, response.responseText));
139144
}
140145
}
141146
}

src/components/ChapterVoteComponent.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
88
import { VoteResponse } from "../messageTypes";
99
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1010
import { Tooltip } from "../render/Tooltip";
11-
import { getErrorMessage } from "../../maze-utils/src/formating";
11+
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
12+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1213

1314
export interface ChapterVoteProps {
1415
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -119,12 +120,16 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
119120
const response = await this.props.vote(type, this.state.segment.UUID);
120121
await stopAnimation();
121122

122-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
123+
if ("error" in response){
124+
console.error("[SB] Caught error while attempting to vote on a chapter", response.error);
125+
alert(formatJSErrorMessage(response.error));
126+
} else if (response.ok || response.status == 429) {
123127
this.setState({
124128
show: type === 1
125129
});
126-
} else if (response.statusCode !== 403) {
127-
alert(getErrorMessage(response.statusCode, response.responseText));
130+
} else if (response.status !== 403) {
131+
logRequest({headers: null, ...response}, "SB", "vote on chapter");
132+
alert(getLongErrorMessage(response.status, response.responseText));
128133
}
129134
}
130135
}

src/components/SponsorTimeEditComponent.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { defaultPreviewTime } from "../utils/constants";
1212
import { getVideo, getVideoDuration } from "../../maze-utils/src/video";
1313
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1414
import { Tooltip } from "../render/Tooltip";
15+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1516

1617
export interface SponsorTimeEditProps {
1718
index: number;
@@ -781,23 +782,26 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
781782
if (this.props.contentContainer().channelIDInfo.status !== ChannelIDStatus.Found) return;
782783

783784
this.fetchingSuggestions = true;
784-
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
785-
description,
786-
channelID: this.props.contentContainer().channelIDInfo.id
787-
});
788-
789-
if (result.ok) {
790-
try {
785+
try {
786+
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
787+
description,
788+
channelID: this.props.contentContainer().channelIDInfo.id
789+
});
790+
if (result.ok) {
791791
const names = JSON.parse(result.responseText) as {description: string}[];
792792
this.setState({
793793
suggestedNames: names.map(n => ({
794794
label: n.description
795795
}))
796796
});
797-
} catch (e) {} //eslint-disable-line no-empty
797+
} else if (result.status !== 404) {
798+
logRequest(result, "SB", "chapter suggestion")
799+
}
800+
} catch (e) {
801+
console.warn("[SB] Caught error while fetching chapter suggestions", e);
802+
} finally {
803+
this.fetchingSuggestions = false;
798804
}
799-
800-
this.fetchingSuggestions = false;
801805
}
802806

803807
configUpdate(): void {

src/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ const syncDefaults = {
363363
hideSkipButtonPlayerControls: false,
364364
hideDiscordLaunches: 0,
365365
hideDiscordLink: false,
366-
invidiousInstances: ["invidious.snopyta.org"], // leave as default
366+
invidiousInstances: [],
367367
supportInvidious: false,
368368
serverAddress: CompileConfig.serverAddress,
369369
minDuration: 0,
@@ -583,4 +583,4 @@ export function generateDebugDetails(): string {
583583
output.config.skipRules = output.config.skipRules.length;
584584

585585
return JSON.stringify(output, null, 4);
586-
}
586+
}

src/content.ts

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { importTimes } from "./utils/exporter";
3333
import { ChapterVote } from "./render/ChapterVote";
3434
import { openWarningDialog } from "./utils/warnings";
3535
import { extensionUserAgent, isFirefoxOrSafari, waitFor } from "../maze-utils/src";
36-
import { getErrorMessage, getFormattedTime } from "../maze-utils/src/formating";
36+
import { formatJSErrorMessage, getFormattedTime, getLongErrorMessage } from "../maze-utils/src/formating";
3737
import { getChannelIDInfo, getVideo, getIsAdPlaying, getIsLivePremiere, setIsAdPlaying, checkVideoIDChange, getVideoID, getYouTubeVideoID, setupVideoModule, checkIfNewVideoID, isOnInvidious, isOnMobileYouTube, isOnYouTubeMusic, isOnYTTV, getLastNonInlineVideoID, triggerVideoIDChange, triggerVideoElementChange, getIsInline, getCurrentTime, setCurrentTime, getVideoDuration, verifyCurrentTime, waitForVideo } from "../maze-utils/src/video";
3838
import { Keybind, StorageChangesObject, isSafari, keybindEquals, keybindToString } from "../maze-utils/src/config";
3939
import { findValidElement } from "../maze-utils/src/dom"
@@ -53,6 +53,7 @@ import { onVideoPage } from "../maze-utils/src/pageInfo";
5353
import { getSegmentsForVideo } from "./utils/segmentData";
5454
import { getCategoryDefaultSelection, getCategorySelection } from "./utils/skipRule";
5555
import { getSkipProfileBool, getSkipProfileIDForTab, hideTooShortSegments, setCurrentTabSkipProfile } from "./utils/skipProfiles";
56+
import { FetchResponse, logRequest } from "../maze-utils/src/background-request-proxy";
5657

5758
cleanPage();
5859

@@ -172,7 +173,7 @@ let popupInitialised = false;
172173

173174
let submissionNotice: SubmissionNotice = null;
174175

175-
let lastResponseStatus: number;
176+
let lastResponseStatus: number | Error | string;
176177

177178
// Contains all of the functions and variables needed by the skip notice
178179
const skipNoticeContentContainer: ContentContainer = () => ({
@@ -1335,15 +1336,19 @@ function handleExistingChaptersChannelChange() {
13351336

13361337
async function lockedCategoriesLookup(): Promise<void> {
13371338
const hashPrefix = (await getHash(getVideoID(), 1)).slice(0, 4);
1338-
const response = await asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
1339+
try {
1340+
const response = await asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
13391341

1340-
if (response.ok) {
1341-
try {
1342+
if (response.ok) {
13421343
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === getVideoID())[0]?.categories;
13431344
if (Array.isArray(categoriesResponse)) {
13441345
lockedCategories = categoriesResponse;
13451346
}
1346-
} catch (e) { } //eslint-disable-line no-empty
1347+
} else if (response.status !== 404) {
1348+
logRequest(response, "SB", "locked categories")
1349+
}
1350+
} catch (e) {
1351+
console.warn(`[SB] Caught error while looking up category locks for hashprefix ${hashPrefix}`, e)
13471352
}
13481353
}
13491354

@@ -1742,7 +1747,11 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
17421747
counted = true;
17431748
}
17441749

1745-
if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID());
1750+
if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID())
1751+
.then(r => {
1752+
if (!r.ok) logRequest(r, "SB", "segment skip log");
1753+
})
1754+
.catch(e => console.warn("[SB] Caught error while attempting to log segment skip", e));
17461755
}
17471756
}
17481757
}
@@ -2302,25 +2311,29 @@ function clearSponsorTimes() {
23022311
async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent): Promise<VoteResponse> {
23032312
if (skipNotice !== null && skipNotice !== undefined) {
23042313
//add loading info
2305-
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
2306-
skipNotice.setNoticeInfoMessage.bind(skipNotice)();
2314+
skipNotice.addVoteButtonInfo(chrome.i18n.getMessage("Loading"))
2315+
skipNotice.setNoticeInfoMessage();
23072316
}
23082317

23092318
const response = await voteAsync(type, UUID, category);
23102319
if (response != undefined) {
23112320
//see if it was a success or failure
23122321
if (skipNotice != null) {
2313-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
2322+
if ("error" in response) {
2323+
skipNotice.setNoticeInfoMessage(formatJSErrorMessage(response.error))
2324+
skipNotice.resetVoteButtonInfo();
2325+
} else if (response.ok || response.status === 429) {
23142326
//success (treat rate limits as a success)
2315-
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
2316-
} else if (response.successType == -1) {
2317-
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
2327+
skipNotice.afterVote(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
2328+
} else {
2329+
logRequest({headers: null, ...response}, "SB", "vote on segment");
2330+
if (response.status === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
23182331
openWarningDialog(skipNoticeContentContainer);
23192332
} else {
2320-
skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText))
2333+
skipNotice.setNoticeInfoMessage(getLongErrorMessage(response.status, response.responseText))
23212334
}
23222335

2323-
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
2336+
skipNotice.resetVoteButtonInfo();
23242337
}
23252338
}
23262339
}
@@ -2357,7 +2370,7 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category):
23572370
category: category,
23582371
videoID: getVideoID()
23592372
}, (response) => {
2360-
if (response.successType === 1) {
2373+
if (response.ok === true) {
23612374
// Change the sponsor locally
23622375
const segment = utils.getSponsorTimeFromUUID(sponsorTimes, UUID);
23632376
if (segment) {
@@ -2486,13 +2499,23 @@ async function sendSubmitMessage(): Promise<boolean> {
24862499
}
24872500
}
24882501

2489-
const response = await asyncRequestToServer("POST", "/api/skipSegments", {
2490-
videoID: getVideoID(),
2491-
userID: Config.config.userID,
2492-
segments: sponsorTimesSubmitting,
2493-
videoDuration: getVideoDuration(),
2494-
userAgent: extensionUserAgent(),
2495-
});
2502+
let response: FetchResponse;
2503+
try {
2504+
response = await asyncRequestToServer("POST", "/api/skipSegments", {
2505+
videoID: getVideoID(),
2506+
userID: Config.config.userID,
2507+
segments: sponsorTimesSubmitting,
2508+
videoDuration: getVideoDuration(),
2509+
userAgent: extensionUserAgent(),
2510+
});
2511+
} catch (e) {
2512+
console.error("[SB] Caught error while attempting to submit segments", e);
2513+
// Show that the upload failed
2514+
playerButtons.submit.button.style.animation = "unset";
2515+
playerButtons.submit.image.src = chrome.runtime.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
2516+
alert(formatJSErrorMessage(e));
2517+
return false;
2518+
}
24962519

24972520
if (response.status === 200) {
24982521
stopAnimation();
@@ -2537,7 +2560,8 @@ async function sendSubmitMessage(): Promise<boolean> {
25372560
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a tip from a moderator.")) {
25382561
openWarningDialog(skipNoticeContentContainer);
25392562
} else {
2540-
alert(getErrorMessage(response.status, response.responseText));
2563+
logRequest(response, "SB", "segment submission");
2564+
alert(getLongErrorMessage(response.status, response.responseText));
25412565
}
25422566
}
25432567

src/dearrowPromotion.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export async function tryShowingDeArrowPromotion() {
3232
const title = deArrowDataJson?.[getVideoID()]?.titles?.[0];
3333
if (title && title.title && (title.locked || title.votes > 0)) {
3434
Config.config.showDeArrowPromotion = false;
35-
35+
3636
tooltip = new Tooltip({
3737
text: chrome.i18n.getMessage("DeArrowTitleReplacementSuggestion") + "\n\n" + title.title,
3838
linkOnClick: () => {
@@ -71,4 +71,4 @@ function badTitle(title: string): boolean {
7171

7272
export function hideDeArrowPromotion(): void {
7373
if (tooltip) tooltip.close();
74-
}
74+
}

src/messageTypes.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoF
8383

8484
export interface IsInfoFoundMessageResponse {
8585
found: boolean;
86-
status: number;
86+
status: number | string | Error;
8787
sponsorTimes: SponsorTime[];
8888
time: number;
8989
onMobileYouTube: boolean;
@@ -128,11 +128,13 @@ export type MessageResponse =
128128
| LogResponse
129129
| LoopedChapterResponse;
130130

131-
export interface VoteResponse {
132-
successType: number;
133-
statusCode: number;
131+
export type VoteResponse = {
132+
status: number;
133+
ok: boolean;
134134
responseText: string;
135-
}
135+
} | {
136+
error: Error | string;
137+
};
136138

137139
interface ImportSegmentsResponse {
138140
importedSegments: SponsorTime[];

0 commit comments

Comments
 (0)