mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-11 22:17:21 +03:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de830cda48 | ||
|
|
d8057fb547 | ||
|
|
2dd69d443b | ||
|
|
6732850b41 | ||
|
|
287233785e | ||
|
|
de094cb11f | ||
|
|
2307691044 | ||
|
|
2dca0d7526 | ||
|
|
a1505bcf20 | ||
|
|
25b53754ba |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "5.5.8",
|
||||
"version": "5.5.9",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"homepage_url": "https://sponsor.ajay.app",
|
||||
|
||||
12
package-lock.json
generated
12
package-lock.json
generated
@@ -6110,9 +6110,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.4",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
|
||||
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
|
||||
"version": "1.15.6",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -18369,9 +18369,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.15.4",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
|
||||
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
|
||||
"version": "1.15.6",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||
"dev": true
|
||||
},
|
||||
"for-each": {
|
||||
|
||||
Submodule public/_locales updated: 01ee778967...9cfc718fd2
@@ -634,7 +634,19 @@
|
||||
|
||||
<div class="small-description">__MSG_whatTrackDownvotes__</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div data-type="toggle" data-sync="trackDownvotesInPrivate" data-confirm-on="false">
|
||||
<div class="switch-container">
|
||||
<label class="switch">
|
||||
<input id="trackDownvotesInPrivate" type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
<label class="switch-label" for="trackDownvotesInPrivate">
|
||||
__MSG_enableTrackDownvotesInPrivate__
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-type="button-press" data-sync="copyDebugInformation" data-confirm-message="copyDebugInformation">
|
||||
<div class="option-button trigger-button">
|
||||
__MSG_copyDebugInformation__
|
||||
|
||||
@@ -29,6 +29,7 @@ interface SBConfig {
|
||||
trackViewCount: boolean;
|
||||
trackViewCountInPrivate: boolean;
|
||||
trackDownvotes: boolean;
|
||||
trackDownvotesInPrivate: boolean;
|
||||
dontShowNotice: boolean;
|
||||
noticeVisibilityMode: NoticeVisbilityMode;
|
||||
hideVideoPlayerControls: boolean;
|
||||
@@ -290,6 +291,7 @@ const syncDefaults = {
|
||||
trackViewCount: true,
|
||||
trackViewCountInPrivate: true,
|
||||
trackDownvotes: true,
|
||||
trackDownvotesInPrivate: false,
|
||||
dontShowNotice: false,
|
||||
noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip,
|
||||
hideVideoPlayerControls: false,
|
||||
|
||||
@@ -259,11 +259,11 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
case "refreshSegments":
|
||||
// update video on refresh if videoID invalid
|
||||
if (!getVideoID()) {
|
||||
checkVideoIDChange().then(() => {
|
||||
// if still no video ID found, return an empty info to the popup
|
||||
if (!getVideoID()) chrome.runtime.sendMessage({ message: "infoUpdated" });
|
||||
});
|
||||
checkVideoIDChange();
|
||||
}
|
||||
// if popup rescieves no response, or the videoID is invalid,
|
||||
// it will assume the page is not a video page and stop the refresh animation
|
||||
sendResponse({ hasVideo: getVideoID() != null });
|
||||
// fetch segments
|
||||
sponsorsLookup(false);
|
||||
|
||||
|
||||
@@ -748,6 +748,7 @@ class PreviewBar {
|
||||
|
||||
updateChapterText(segments: SponsorTime[], submittingSegments: SponsorTime[], currentTime: number): SponsorTime[] {
|
||||
if (!Config.config.showSegmentNameInChapterBar
|
||||
|| Config.config.disableSkipping
|
||||
|| ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) {
|
||||
const chaptersContainer = this.getChaptersContainer();
|
||||
if (chaptersContainer) {
|
||||
|
||||
@@ -103,7 +103,8 @@ export type MessageResponse =
|
||||
| IsChannelWhitelistedResponse
|
||||
| Record<string, never> // empty object response {}
|
||||
| VoteResponse
|
||||
| ImportSegmentsResponse;
|
||||
| ImportSegmentsResponse
|
||||
| RefreshSegmentsResponse;
|
||||
|
||||
export interface VoteResponse {
|
||||
successType: number;
|
||||
@@ -115,6 +116,10 @@ interface ImportSegmentsResponse {
|
||||
importedSegments: SponsorTime[];
|
||||
}
|
||||
|
||||
export interface RefreshSegmentsResponse {
|
||||
hasVideo: boolean;
|
||||
}
|
||||
|
||||
export interface TimeUpdateMessage {
|
||||
message: "time";
|
||||
time: number;
|
||||
|
||||
61
src/popup.ts
61
src/popup.ts
@@ -15,6 +15,7 @@ import {
|
||||
Message,
|
||||
MessageResponse,
|
||||
PopupMessage,
|
||||
RefreshSegmentsResponse,
|
||||
SponsorStartResponse,
|
||||
VoteResponse,
|
||||
} from "./messageTypes";
|
||||
@@ -459,39 +460,35 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
stopLoadingAnimation = null;
|
||||
}
|
||||
|
||||
if (chrome.runtime.lastError) {
|
||||
if (chrome.runtime.lastError || request == undefined || request.found == undefined) {
|
||||
//This page doesn't have the injected content script, or at least not yet
|
||||
// Or if the request is empty, meaning the current page is not YouTube or a video page
|
||||
displayNoVideo();
|
||||
return;
|
||||
}
|
||||
|
||||
// if request has no field other than message, then the page currently being browsed is not YouTube
|
||||
if (request.found != undefined) {
|
||||
//remove loading text
|
||||
PageElements.mainControls.style.display = "block";
|
||||
if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden");
|
||||
PageElements.whitelistButton.classList.remove("hidden");
|
||||
PageElements.loadingIndicator.style.display = "none";
|
||||
//remove loading text
|
||||
PageElements.mainControls.style.display = "block";
|
||||
if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden");
|
||||
PageElements.whitelistButton.classList.remove("hidden");
|
||||
PageElements.loadingIndicator.style.display = "none";
|
||||
|
||||
downloadedTimes = request.sponsorTimes ?? [];
|
||||
displayDownloadedSponsorTimes(downloadedTimes, request.time);
|
||||
if (request.found) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
} else if (request.status == 404 || request.status == 200) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
} else {
|
||||
if (request.status) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status;
|
||||
} else {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading");
|
||||
}
|
||||
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
}
|
||||
downloadedTimes = request.sponsorTimes ?? [];
|
||||
displayDownloadedSponsorTimes(downloadedTimes, request.time);
|
||||
if (request.found) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
} else if (request.status == 404 || request.status == 200) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
} else {
|
||||
displayNoVideo();
|
||||
if (request.status) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status;
|
||||
} else {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading");
|
||||
}
|
||||
|
||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||
}
|
||||
|
||||
//see if whitelist button should be swapped
|
||||
@@ -982,9 +979,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
stopLoadingAnimation = AnimationUtils.applyLoadingAnimation(PageElements.refreshSegmentsButton, 0.3);
|
||||
}
|
||||
|
||||
function refreshSegments() {
|
||||
async function refreshSegments() {
|
||||
startLoadingAnimation();
|
||||
sendTabMessage({ message: 'refreshSegments' });
|
||||
const response = await sendTabMessageAsync({ message: 'refreshSegments' }) as RefreshSegmentsResponse;
|
||||
|
||||
if (response == null || !response.hasVideo) {
|
||||
if (stopLoadingAnimation != null) {
|
||||
stopLoadingAnimation();
|
||||
stopLoadingAnimation = null;
|
||||
}
|
||||
displayNoVideo();
|
||||
}
|
||||
}
|
||||
|
||||
function skipSegment(actionType: ActionType, UUID: SegmentUUID, element?: HTMLElement): void {
|
||||
|
||||
@@ -281,7 +281,8 @@ export default class Utils {
|
||||
}
|
||||
|
||||
async addHiddenSegment(videoID: VideoID, segmentUUID: string, hidden: SponsorHideType) {
|
||||
if (chrome.extension.inIncognitoContext || !Config.config.trackDownvotes) return;
|
||||
if ((chrome.extension.inIncognitoContext && !Config.config.trackDownvotesInPrivate)
|
||||
|| !Config.config.trackDownvotes) return;
|
||||
|
||||
const hashedVideoID = (await getHash(videoID, 1)).slice(0, 4) as VideoID & HashedValue;
|
||||
const UUIDHash = await getHash(segmentUUID, 1);
|
||||
|
||||
Reference in New Issue
Block a user