Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion maze-utils
37 changes: 10 additions & 27 deletions src/background.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as CompileConfig from "../config.json";
import Config from "./config";
import { Registration } from "./types";
import "content-scripts-register-polyfill";
import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
import { sendRealRequestToCustomServer, serializeOrStringify, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
import { setupTabUpdates } from "../maze-utils/src/tab-updates";
import { generateUserID } from "../maze-utils/src/setup";

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

try {
const response = await asyncRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&videoID=" + videoID + "&userID=" + userID + typeSection);

if (response.ok) {
return {
successType: 1,
responseText: await response.text()
};
} else if (response.status == 405) {
//duplicate vote
return {
successType: 0,
statusCode: response.status,
responseText: await response.text()
};
} else {
//error while connect
return {
successType: -1,
statusCode: response.status,
responseText: await response.text()
};
}

return {
status: response.status,
ok: response.ok,
responseText: await response.text(),
};
} catch (e) {
console.error(e);
console.error("Error while voting:", e);
return {
successType: -1,
statusCode: -1,
responseText: ""
error: serializeOrStringify(e),
};
}
}
Expand All @@ -263,4 +246,4 @@ async function asyncRequestToServer(type: string, address: string, data = {}) {
const serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;

return await (sendRealRequestToCustomServer(type, serverAddress + address, data));
}
}
13 changes: 9 additions & 4 deletions src/components/CategoryPillComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
import { VoteResponse } from "../messageTypes";
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
import { Tooltip } from "../render/Tooltip";
import { getErrorMessage } from "../../maze-utils/src/formating";
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
import { logRequest } from "../../maze-utils/src/background-request-proxy";

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

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

this.closeTooltip();
} else if (response.statusCode !== 403) {
alert(getErrorMessage(response.statusCode, response.responseText));
} else if (response.status !== 403) {
logRequest({headers: null, ...response}, "SB", "vote on FV label");
alert(getLongErrorMessage(response.status, response.responseText));
}
}
}
Expand Down
13 changes: 9 additions & 4 deletions src/components/ChapterVoteComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
import { VoteResponse } from "../messageTypes";
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
import { Tooltip } from "../render/Tooltip";
import { getErrorMessage } from "../../maze-utils/src/formating";
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
import { logRequest } from "../../maze-utils/src/background-request-proxy";

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

if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
if ("error" in response){
console.error("[SB] Caught error while attempting to vote on a chapter", response.error);
alert(formatJSErrorMessage(response.error));
} else if (response.ok || response.status == 429) {
this.setState({
show: type === 1
});
} else if (response.statusCode !== 403) {
alert(getErrorMessage(response.statusCode, response.responseText));
} else if (response.status !== 403) {
logRequest({headers: null, ...response}, "SB", "vote on chapter");
alert(getLongErrorMessage(response.status, response.responseText));
}
}
}
Expand Down
24 changes: 14 additions & 10 deletions src/components/SponsorTimeEditComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { defaultPreviewTime } from "../utils/constants";
import { getVideo, getVideoDuration } from "../../maze-utils/src/video";
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
import { Tooltip } from "../render/Tooltip";
import { logRequest } from "../../maze-utils/src/background-request-proxy";

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

this.fetchingSuggestions = true;
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
description,
channelID: this.props.contentContainer().channelIDInfo.id
});

if (result.ok) {
try {
try {
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
description,
channelID: this.props.contentContainer().channelIDInfo.id
});
if (result.ok) {
const names = JSON.parse(result.responseText) as {description: string}[];
this.setState({
suggestedNames: names.map(n => ({
label: n.description
}))
});
} catch (e) {} //eslint-disable-line no-empty
} else if (result.status !== 404) {
logRequest(result, "SB", "chapter suggestion")
}
} catch (e) {
console.warn("[SB] Caught error while fetching chapter suggestions", e);
} finally {
this.fetchingSuggestions = false;
}

this.fetchingSuggestions = false;
}

configUpdate(): void {
Expand Down
72 changes: 48 additions & 24 deletions src/content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { importTimes } from "./utils/exporter";
import { ChapterVote } from "./render/ChapterVote";
import { openWarningDialog } from "./utils/warnings";
import { extensionUserAgent, isFirefoxOrSafari, waitFor } from "../maze-utils/src";
import { getErrorMessage, getFormattedTime } from "../maze-utils/src/formating";
import { formatJSErrorMessage, getFormattedTime, getLongErrorMessage } from "../maze-utils/src/formating";
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";
import { Keybind, StorageChangesObject, isSafari, keybindEquals, keybindToString } from "../maze-utils/src/config";
import { findValidElement } from "../maze-utils/src/dom"
Expand All @@ -53,6 +53,7 @@ import { defaultPreviewTime } from "./utils/constants";
import { onVideoPage } from "../maze-utils/src/pageInfo";
import { getSegmentsForVideo } from "./utils/segmentData";
import { getCategoryDefaultSelection, getCategorySelection } from "./utils/skipRule";
import { FetchResponse, logRequest } from "../maze-utils/src/background-request-proxy";

cleanPage();

Expand Down Expand Up @@ -173,7 +174,7 @@ let popupInitialised = false;

let submissionNotice: SubmissionNotice = null;

let lastResponseStatus: number;
let lastResponseStatus: number | Error | string;

// Contains all of the functions and variables needed by the skip notice
const skipNoticeContentContainer: ContentContainer = () => ({
Expand Down Expand Up @@ -1314,15 +1315,19 @@ function importExistingChapters(wait: boolean) {

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

if (response.ok) {
try {
if (response.ok) {
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === getVideoID())[0]?.categories;
if (Array.isArray(categoriesResponse)) {
lockedCategories = categoriesResponse;
}
} catch (e) { } //eslint-disable-line no-empty
} else if (response.status !== 404) {
logRequest(response, "SB", "locked categories")
}
} catch (e) {
console.warn(`[SB] Caught error while looking up category locks for hashprefix ${hashPrefix}`, e)
}
}

Expand Down Expand Up @@ -1724,7 +1729,11 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
counted = true;
}

if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID());
if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID())
.then(r => {
if (!r.ok) logRequest(r, "SB", "segment skip log");
})
.catch(e => console.warn("[SB] Caught error while attempting to log segment skip", e));
}
}
}
Expand Down Expand Up @@ -2284,25 +2293,29 @@ function clearSponsorTimes() {
async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent): Promise<VoteResponse> {
if (skipNotice !== null && skipNotice !== undefined) {
//add loading info
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
skipNotice.setNoticeInfoMessage.bind(skipNotice)();
skipNotice.addVoteButtonInfo(chrome.i18n.getMessage("Loading"))
skipNotice.setNoticeInfoMessage();
}

const response = await voteAsync(type, UUID, category);
if (response != undefined) {
//see if it was a success or failure
if (skipNotice != null) {
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
if ("error" in response) {
skipNotice.setNoticeInfoMessage(formatJSErrorMessage(response.error))
skipNotice.resetVoteButtonInfo();
} else if (response.ok || response.status === 429) {
//success (treat rate limits as a success)
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
} else if (response.successType == -1) {
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
skipNotice.afterVote(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
} else {
logRequest({headers: null, ...response}, "SB", "vote on segment");
if (response.status === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
openWarningDialog(skipNoticeContentContainer);
} else {
skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText))
skipNotice.setNoticeInfoMessage(getLongErrorMessage(response.status, response.responseText))
}

skipNotice.resetVoteButtonInfo.bind(skipNotice)();
skipNotice.resetVoteButtonInfo();
}
}
}
Expand Down Expand Up @@ -2339,7 +2352,7 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category):
category: category,
videoID: getVideoID()
}, (response) => {
if (response.successType === 1) {
if (response.ok === true) {
// Change the sponsor locally
const segment = utils.getSponsorTimeFromUUID(sponsorTimes, UUID);
if (segment) {
Expand Down Expand Up @@ -2468,13 +2481,23 @@ async function sendSubmitMessage(): Promise<boolean> {
}
}

const response = await asyncRequestToServer("POST", "/api/skipSegments", {
videoID: getVideoID(),
userID: Config.config.userID,
segments: sponsorTimesSubmitting,
videoDuration: getVideoDuration(),
userAgent: extensionUserAgent(),
});
let response: FetchResponse;
try {
response = await asyncRequestToServer("POST", "/api/skipSegments", {
videoID: getVideoID(),
userID: Config.config.userID,
segments: sponsorTimesSubmitting,
videoDuration: getVideoDuration(),
userAgent: extensionUserAgent(),
});
} catch (e) {
console.error("[SB] Caught error while attempting to submit segments", e);
// Show that the upload failed
playerButtons.submit.button.style.animation = "unset";
playerButtons.submit.image.src = chrome.runtime.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
alert(formatJSErrorMessage(e));
return false;
}

if (response.status === 200) {
stopAnimation();
Expand Down Expand Up @@ -2523,7 +2546,8 @@ async function sendSubmitMessage(): Promise<boolean> {
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a tip from a moderator.")) {
openWarningDialog(skipNoticeContentContainer);
} else {
alert(getErrorMessage(response.status, response.responseText));
logRequest(response, "SB", "segment submission");
alert(getLongErrorMessage(response.status, response.responseText));
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/dearrowPromotion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export async function tryShowingDeArrowPromotion() {
const title = deArrowDataJson?.[getVideoID()]?.titles?.[0];
if (title && title.title && (title.locked || title.votes > 0)) {
Config.config.showDeArrowPromotion = false;

tooltip = new Tooltip({
text: chrome.i18n.getMessage("DeArrowTitleReplacementSuggestion") + "\n\n" + title.title,
linkOnClick: () => {
Expand Down Expand Up @@ -71,4 +71,4 @@ function badTitle(title: string): boolean {

export function hideDeArrowPromotion(): void {
if (tooltip) tooltip.close();
}
}
12 changes: 7 additions & 5 deletions src/messageTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoF

export interface IsInfoFoundMessageResponse {
found: boolean;
status: number;
status: number | string | Error;
sponsorTimes: SponsorTime[];
time: number;
onMobileYouTube: boolean;
Expand Down Expand Up @@ -120,11 +120,13 @@ export type MessageResponse =
| LogResponse
| LoopedChapterResponse;

export interface VoteResponse {
successType: number;
statusCode: number;
export type VoteResponse = {
status: number;
ok: boolean;
responseText: string;
}
} | {
error: Error | string;
};

interface ImportSegmentsResponse {
importedSegments: SponsorTime[];
Expand Down
2 changes: 2 additions & 0 deletions src/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,8 @@ function activatePrivateTextChange(element: HTMLElement) {
if (userInfo.warnings > 0 || userInfo.banned) {
setButton.classList.add("hidden");
}
}).catch(e => {
console.error("[SB] Caught error while fetching user info for the new user ID", e)
});
}

Expand Down
Loading