From 8a6488f0823521ca1d9add9a3a75b1fc4e416d43 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 26 Apr 2020 18:07:10 -0400 Subject: [PATCH] Added migration code for whitelisted channelIDs vs URLs --- src/config.ts | 37 +++++++++++++++++++++++++++++++++++-- src/utils.ts | 30 +++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/config.ts b/src/config.ts index 0f73b649..9d69e681 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,10 +1,13 @@ import * as CompileConfig from "../config.json"; import { CategorySelection, CategorySkipOption } from "./types"; +import Utils from "./utils"; +const utils = new Utils(); + interface SBConfig { userID: string, sponsorTimes: SBMap, - whitelistedChannels: Array, + whitelistedChannels: string[], startSponsorKeybind: string, submitKeybind: string, minutesSaved: number, @@ -236,7 +239,7 @@ function fetchConfig() { }); } -function migrateOldFormats() { +async function migrateOldFormats() { if (Config.config["disableAutoSkip"]) { for (const selection of Config.config.categorySelections) { if (selection.name === "sponsor") { @@ -246,6 +249,36 @@ function migrateOldFormats() { } } } + + // Channel URLS + if (Config.config.whitelistedChannels.length > 0 && + (Config.config.whitelistedChannels[0].includes("/") || Config.config.whitelistedChannels[0] == null)) { + let newChannelList: string[] = []; + for (const item of Config.config.whitelistedChannels) { + if (item != null) { + if (item.includes("/channel/")) { + newChannelList.push(item.split("/")[2]); + } else if (item.includes("/user/") && utils.isContentScript()) { + // Replace channel URL with channelID + let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId"); + + if (response.ok) { + newChannelList.push((await response.json()).authorId); + } else { + // Add it at the beginning so it gets converted later + newChannelList.unshift(item); + } + } else if (item.includes("/user/")) { + // Add it at the beginning so it gets converted later (The API can only be called in the content script due to CORS issues) + newChannelList.unshift(item); + } else { + newChannelList.push(item); + } + } + } + + Config.config.whitelistedChannels = newChannelList; + } } async function setupConfig() { diff --git a/src/utils.ts b/src/utils.ts index ce436d1e..a634112c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -270,27 +270,26 @@ class Utils { } /** - * Sends a request to the SponsorBlock server with address added as a query + * Sends a request to a custom server * * @param type The request type. "GET", "POST", etc. * @param address The address to add to the SponsorBlock server address * @param callback */ - async asyncRequestToServer(type: string, address: string, data = {}) { - let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress; + async asyncRequestToCustomServer(type: string, url: string, data = {}) { // If GET, convert JSON to parameters if (type.toLowerCase() === "get") { for (const key in data) { - let seperator = address.includes("?") ? "&" : "?"; + let seperator = url.includes("?") ? "&" : "?"; let value = (typeof(data[key]) === "string") ? data[key]: JSON.stringify(data[key]); - address += seperator + key + "=" + value; + url += seperator + key + "=" + value; } data = null; } - const response = await fetch(serverAddress + address, { + const response = await fetch(url, { method: type, headers: { 'Content-Type': 'application/json' @@ -302,6 +301,19 @@ class Utils { return response; } + /** + * Sends a request to the SponsorBlock server with address added as a query + * + * @param type The request type. "GET", "POST", etc. + * @param address The address to add to the SponsorBlock server address + * @param callback + */ + async asyncRequestToServer(type: string, address: string, data = {}) { + let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress; + + return await (this.asyncRequestToCustomServer(type, serverAddress + address, data)); + } + /** * Sends a request to the SponsorBlock server with address added as a query * @@ -361,10 +373,14 @@ class Utils { return minutes * 60 + seconds; } + isContentScript(): boolean { + return window.location.protocol === "http:" || window.location.protocol === "https:"; + } + /** * Is this Firefox (web-extensions) */ - isFirefox() { + isFirefox(): boolean { return typeof(browser) !== "undefined"; } }