Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Anarios/return-youtube-dislike.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Krupin <krupin.nikita0110@gmail.com>2022-01-05 02:11:06 +0300
committerNikita Krupin <krupin.nikita0110@gmail.com>2022-01-05 02:11:06 +0300
commitf028584947b612e7785ad4f25a0d8500afda455f (patch)
tree23571de2ec34c92350f4b34a6eeae12ca073bf21
parent673040e07b968229ef14a05d8f3ad4b672b2ae7d (diff)
parent2aeb21493319a01f8474c2b70903b07732b46e15 (diff)
fixed conflict
-rw-r--r--.github/workflows/weblint.yml8
-rw-r--r--.gitignore1
-rw-r--r--Extensions/combined/debug.js8
-rw-r--r--Extensions/combined/dist/chrome/bundled-content-script.js361
-rw-r--r--Extensions/combined/dist/chrome/content-style.css26
-rw-r--r--Extensions/combined/dist/chrome/icons/icon128.pngbin7093 -> 0 bytes
-rw-r--r--Extensions/combined/dist/chrome/icons/icon48.pngbin4454 -> 0 bytes
-rw-r--r--Extensions/combined/dist/chrome/manifest.json41
-rw-r--r--Extensions/combined/dist/chrome/popup.css119
-rw-r--r--Extensions/combined/dist/chrome/popup.html48
-rw-r--r--Extensions/combined/dist/chrome/popup.js61
-rw-r--r--Extensions/combined/dist/chrome/ryd.background.js220
-rw-r--r--Extensions/combined/dist/firefox/bundled-content-script.js361
-rw-r--r--Extensions/combined/dist/firefox/content-style.css26
-rw-r--r--Extensions/combined/dist/firefox/icons/icon128.pngbin7093 -> 0 bytes
-rw-r--r--Extensions/combined/dist/firefox/icons/icon48.pngbin4454 -> 0 bytes
-rw-r--r--Extensions/combined/dist/firefox/manifest.json26
-rw-r--r--Extensions/combined/dist/firefox/popup.css119
-rw-r--r--Extensions/combined/dist/firefox/popup.html48
-rw-r--r--Extensions/combined/dist/firefox/popup.js61
-rw-r--r--Extensions/combined/dist/firefox/ryd.background.js220
-rw-r--r--Extensions/combined/icons/server.svg1
-rw-r--r--Extensions/combined/manifest-chrome.json4
-rw-r--r--Extensions/combined/manifest-firefox.json5
-rw-r--r--Extensions/combined/popup.css14
-rw-r--r--Extensions/combined/popup.html32
-rw-r--r--Extensions/combined/popup.js55
-rw-r--r--Extensions/combined/src/events.js10
-rw-r--r--README.md13
-rw-r--r--Website/layouts/default.vue31
-rw-r--r--Website/nuxt.config.js13
-rw-r--r--Website/package-lock.json60
-rw-r--r--Website/package.json1
-rw-r--r--Website/pages/debug.vue68
-rw-r--r--Website/pages/documentation.vue60
-rw-r--r--Website/pages/documentation/endpoints.vue19
-rw-r--r--Website/pages/documentation/fetching.vue78
-rw-r--r--Website/pages/documentation/index.vue8
-rw-r--r--Website/pages/documentation/url.vue17
-rw-r--r--Website/pages/documentation/usage-rights.vue30
-rw-r--r--Website/pages/index.vue2
-rw-r--r--Website/pages/install.vue2
-rw-r--r--package-lock.json19
43 files changed, 476 insertions, 1820 deletions
diff --git a/.github/workflows/weblint.yml b/.github/workflows/weblint.yml
index eea4ec9..84fd10c 100644
--- a/.github/workflows/weblint.yml
+++ b/.github/workflows/weblint.yml
@@ -20,9 +20,7 @@ jobs:
steps:
- uses: actions/checkout@main
- - name: npm install
- run: npm install
+ - run: npm install
+ working-directory: Website
+ - run: npm run lint
working-directory: Website
- - name: npm run lint
- run: npm run lint
- working-directory: Website \ No newline at end of file
diff --git a/.gitignore b/.gitignore
index d0c5794..c15edbd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,4 @@ Extensions/combined/bundled-content-script.js
# Dist Files
Extensions/combined/dist/*
package-lock.json
+Website/package-lock.json
diff --git a/Extensions/combined/debug.js b/Extensions/combined/debug.js
new file mode 100644
index 0000000..4bff57f
--- /dev/null
+++ b/Extensions/combined/debug.js
@@ -0,0 +1,8 @@
+//--- Get Extension Information ---//
+const extension = chrome.runtime.getManifest();
+
+//--- Get Debug Elements ---//
+const ver = document.getElementById("extension-version");
+
+//--- Set Debug Elements ---//
+ver.innerHTML = extension.version; \ No newline at end of file
diff --git a/Extensions/combined/dist/chrome/bundled-content-script.js b/Extensions/combined/dist/chrome/bundled-content-script.js
deleted file mode 100644
index 4685457..0000000
--- a/Extensions/combined/dist/chrome/bundled-content-script.js
+++ /dev/null
@@ -1,361 +0,0 @@
-/******/ (() => { // webpackBootstrap
-/******/ "use strict";
-var __webpack_exports__ = {};
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/bar.js
-
-
-function createRateBar(likes, dislikes) {
- var rateBar = document.getElementById("ryd-bar-container");
- var widthPx = buttons_getButtons().children[0].clientWidth + buttons_getButtons().children[1].clientWidth + 8;
- var widthPercent = likes + dislikes > 0 ? likes / (likes + dislikes) * 100 : 50;
-
- if (!rateBar) {
- (document.getElementById("menu-container") || document.querySelector("ytm-slim-video-action-bar-renderer")).insertAdjacentHTML("beforeend", "\n <div class=\"ryd-tooltip\" style=\"width: ".concat(widthPx, "px\">\n <div class=\"ryd-tooltip-bar-container\">\n <div\n id=\"ryd-bar-container\"\n style=\"width: 100%; height: 2px;\"\n >\n <div\n id=\"ryd-bar\"\n style=\"width: ").concat(widthPercent, "%; height: 100%\"\n ></div>\n </div>\n </div>\n <tp-yt-paper-tooltip position=\"top\" id=\"ryd-dislike-tooltip\" class=\"style-scope ytd-sentiment-bar-renderer\" role=\"tooltip\" tabindex=\"-1\">\n <!--css-build:shady-->").concat(likes.toLocaleString(), "&nbsp;/&nbsp;").concat(dislikes.toLocaleString(), "\n </tp-yt-paper-tooltip>\n </div>\n "));
- } else {
- document.getElementById("ryd-bar-container").style.width = widthPx + "px";
- document.getElementById("ryd-bar").style.width = widthPercent + "%";
- document.querySelector("#ryd-dislike-tooltip > #tooltip").innerHTML = "".concat(likes.toLocaleString(), "&nbsp;/&nbsp;").concat(dislikes.toLocaleString());
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/utils.js
-function roundDown(num) {
- if (num < 1000) return num;
-
- var _int = Math.floor(Math.log10(num) - 2);
-
- var decimal = _int + (_int % 3 ? 1 : 0);
- var value = Math.floor(num / Math.pow(10, decimal));
- return value * Math.pow(10, decimal);
-}
-
-function numberFormat(numberState) {
- var userLocales;
-
- try {
- var _URL, _URL$searchParams, _Array$from, _Array$from$find;
-
- userLocales = (_URL = new URL((_Array$from = Array.from(document.querySelectorAll("head > link[rel='search']"))) === null || _Array$from === void 0 ? void 0 : (_Array$from$find = _Array$from.find(function (n) {
- var _n$getAttribute;
-
- return n === null || n === void 0 ? void 0 : (_n$getAttribute = n.getAttribute("href")) === null || _n$getAttribute === void 0 ? void 0 : _n$getAttribute.includes("?locale=");
- })) === null || _Array$from$find === void 0 ? void 0 : _Array$from$find.getAttribute("href"))) === null || _URL === void 0 ? void 0 : (_URL$searchParams = _URL.searchParams) === null || _URL$searchParams === void 0 ? void 0 : _URL$searchParams.get("locale");
- } catch (_unused) {}
-
- var formatter = Intl.NumberFormat(document.documentElement.lang || userLocales || navigator.language, {
- notation: "compact"
- });
- return formatter.format(roundDown(numberState));
-}
-
-function getBrowser() {
- if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
- return chrome;
- } else if (typeof browser !== "undefined" && typeof browser.runtime !== "undefined") {
- return browser;
- } else {
- console.log("browser is not supported");
- return false;
- }
-}
-
-function getVideoId(url) {
- var urlObject = new URL(url);
- var pathname = urlObject.pathname;
-
- if (pathname.startsWith("/clip")) {
- return document.querySelector("meta[itemprop='videoId']").content;
- } else {
- return urlObject.searchParams.get("v");
- }
-}
-
-function isVideoLoaded() {
- var videoId = getVideoId(window.location.href);
- return document.querySelector("ytd-watch-flexy[video-id='".concat(videoId, "']")) !== null || // mobile: no video-id attribute
- document.querySelector('#player[loading="false"]:not([hidden])') !== null;
-}
-
-function cLog(message, writer) {
- message = "[return youtube dislike]: ".concat(message);
-
- if (writer) {
- writer(message);
- } else {
- console.log(message);
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/events.js
-
-
-
-
-
-function sendVote(vote) {
- getBrowser().runtime.sendMessage({
- message: "send_vote",
- vote: vote,
- videoId: getVideoId(window.location.href)
- });
-}
-
-function sendVideoIds() {
- var links = Array.from(document.getElementsByClassName("yt-simple-endpoint ytd-compact-video-renderer")).concat(Array.from(document.getElementsByClassName("yt-simple-endpoint ytd-thumbnail"))); // Also try mobile
-
- if (links.length < 1) links = Array.from(document.querySelectorAll(".large-media-item-metadata > a, a.large-media-item-thumbnail-container"));
- var ids = links.filter(function (x) {
- return x.href && x.href.indexOf("/watch?v=") > 0;
- }).map(function (x) {
- return getVideoId(x.href);
- });
- getBrowser().runtime.sendMessage({
- message: "send_links",
- videoIds: ids
- });
-}
-
-function likeClicked(storedData) {
- if (checkForSignInButton() === false) {
- if (storedData.previousState === DISLIKED_STATE) {
- sendVote(1);
- storedData.dislikes--;
- storedData.likes++;
- createRateBar(storedData.likes, storedData.dislikes);
- setDislikes(numberFormat(storedData.dislikes));
- storedData.previousState = LIKED_STATE;
- } else if (storedData.previousState === NEUTRAL_STATE) {
- sendVote(1);
- storedData.likes++;
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = LIKED_STATE;
- } else if (storedData.previousState = LIKED_STATE) {
- sendVote(0);
- storedData.likes--;
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = NEUTRAL_STATE;
- }
- }
-}
-
-function dislikeClicked(storedData) {
- if (checkForSignInButton() == false) {
- if (storedData.previousState === NEUTRAL_STATE) {
- sendVote(-1);
- storedData.dislikes++;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = DISLIKED_STATE;
- } else if (storedData.previousState === DISLIKED_STATE) {
- sendVote(0);
- storedData.dislikes--;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = NEUTRAL_STATE;
- } else if (storedData.previousState === LIKED_STATE) {
- sendVote(-1);
- storedData.likes--;
- storedData.dislikes++;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = DISLIKED_STATE;
- }
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/state.js
-
-
-
-
-var LIKED_STATE = "LIKED_STATE";
-var DISLIKED_STATE = "DISLIKED_STATE";
-var NEUTRAL_STATE = "NEUTRAL_STATE";
-
-function isMobile() {
- return location.hostname == "m.youtube.com";
-}
-
-function isVideoLiked() {
- if (isMobile()) {
- return getLikeButton().querySelector("button").getAttribute("aria-label") == "true";
- }
-
- return getLikeButton().classList.contains("style-default-active");
-}
-
-function isVideoDisliked() {
- if (isMobile()) {
- return getDislikeButton().querySelector("button").getAttribute("aria-label") == "true";
- }
-
- return getDislikeButton().classList.contains("style-default-active");
-}
-
-function getState(storedData) {
- if (isVideoLiked()) {
- return {
- current: LIKED_STATE,
- previous: storedData.previousState
- };
- }
-
- if (isVideoDisliked()) {
- return {
- current: DISLIKED_STATE,
- previous: storedData.previousState
- };
- }
-
- return {
- current: NEUTRAL_STATE,
- previous: storedData.previousState
- };
-} //--- Sets The Likes And Dislikes Values ---//
-
-
-function setLikes(likesCount) {
- getButtons().children[0].querySelector("#text").innerText = likesCount;
-}
-
-function setDislikes(dislikesCount) {
- if (isMobile()) {
- buttons_getButtons().children[1].querySelector(".button-renderer-text").innerText = dislikesCount;
- return;
- }
-
- buttons_getButtons().children[1].querySelector("#text").innerText = dislikesCount;
-}
-
-function getLikeCountFromButton() {
- var likesStr = getLikeButton().querySelector("button").getAttribute("aria-label").replace(/\D/g, "");
- return likesStr.length > 0 ? parseInt(likesStr) : false;
-}
-
-function processResponse(response, storedData) {
- var formattedDislike = numberFormat(response.dislikes);
- setDislikes(formattedDislike);
- storedData.dislikes = parseInt(response.dislikes);
- storedData.likes = getLikeCountFromButton() || parseInt(response.likes);
- createRateBar(storedData.likes, storedData.dislikes);
-}
-
-function setState(storedData) {
- storedData.previousState = isVideoDisliked() ? DISLIKED_STATE : isVideoLiked() ? LIKED_STATE : NEUTRAL_STATE;
- var statsSet = false;
- getBrowser().runtime.sendMessage({
- message: "set_state",
- videoId: getVideoId(window.location.href),
- state: getState(storedData).current,
- likeCount: getLikeCountFromButton() || null
- }, function (response) {
- cLog("response from api:");
- cLog(JSON.stringify(response));
-
- if (response !== undefined && !("traceId" in response) && !statsSet) {
- processResponse(response, storedData);
- } else {}
- });
-}
-
-function setInitialState(storedData) {
- setState(storedData);
- setTimeout(function () {
- sendVideoIds();
- }, 1500);
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/buttons.js
-
-
-function buttons_getButtons() {
- var _document$getElementB;
-
- if (isMobile()) {
- return document.querySelector(".slim-video-action-bar-actions");
- } //--- If Menu Element Is Displayed: ---//
-
-
- if (((_document$getElementB = document.getElementById("menu-container")) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.offsetParent) === null) {
- return document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div"); //--- If Menu Element Isnt Displayed: ---//
- } else {
- var _document$getElementB2;
-
- return (_document$getElementB2 = document.getElementById("menu-container")) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.querySelector("#top-level-buttons-computed");
- }
-}
-
-function getLikeButton() {
- return buttons_getButtons().children[0];
-}
-
-function getDislikeButton() {
- return buttons_getButtons().children[1];
-}
-
-function checkForSignInButton() {
- if (document.querySelector("a[href^='https://accounts.google.com/ServiceLogin']")) {
- return true;
- } else {
- return false;
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/ryd.content-script.js
-
-
-
-
-
-var storedData = {
- likes: 0,
- dislikes: 0,
- previousState: NEUTRAL_STATE
-};
-var jsInitChecktimer = null;
-
-function setEventListeners(evt) {
- function checkForJS_Finish() {
- var _getButtons;
-
- if ((_getButtons = buttons_getButtons()) !== null && _getButtons !== void 0 && _getButtons.offsetParent && isVideoLoaded()) {
- clearInterval(jsInitChecktimer);
- jsInitChecktimer = null;
- var buttons = buttons_getButtons();
-
- if (!window.returnDislikeButtonlistenersSet) {
- buttons.children[0].addEventListener("click", function () {
- return likeClicked(storedData);
- });
- buttons.children[1].addEventListener("click", function () {
- return dislikeClicked(storedData);
- });
- window.returnDislikeButtonlistenersSet = true;
- }
-
- setInitialState(storedData);
- }
- }
-
- if (window.location.href.indexOf("watch?") >= 0) {
- jsInitChecktimer = setInterval(checkForJS_Finish, 111);
- }
-}
-
-setEventListeners();
-document.addEventListener("yt-navigate-finish", function (event) {
- if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
- window.returnDislikeButtonlistenersSet = false;
- setEventListeners();
-});
-setTimeout(function () {
- return sendVideoIds();
-}, 2500);
-/******/ })()
-; \ No newline at end of file
diff --git a/Extensions/combined/dist/chrome/content-style.css b/Extensions/combined/dist/chrome/content-style.css
deleted file mode 100644
index c06b29c..0000000
--- a/Extensions/combined/dist/chrome/content-style.css
+++ /dev/null
@@ -1,26 +0,0 @@
-#ryd-bar-container {
- background: var(--yt-spec-icon-disabled);
- border-radius: 2px;
-}
-
-#ryd-bar {
- background: var(--yt-spec-text-primary);
- border-radius: 2px;
- transition: all 0.15s ease-in-out;
-}
-
-.ryd-tooltip {
- position: relative;
- display: block;
- height: 2px;
- top: 9px;
-}
-
-.ryd-tooltip-bar-container {
- width: 100%;
- height: 2px;
- position: absolute;
- padding-top: 6px;
- padding-bottom: 28px;
- top: -6px;
-}
diff --git a/Extensions/combined/dist/chrome/icons/icon128.png b/Extensions/combined/dist/chrome/icons/icon128.png
deleted file mode 100644
index 23b4958..0000000
--- a/Extensions/combined/dist/chrome/icons/icon128.png
+++ /dev/null
Binary files differ
diff --git a/Extensions/combined/dist/chrome/icons/icon48.png b/Extensions/combined/dist/chrome/icons/icon48.png
deleted file mode 100644
index f2a5951..0000000
--- a/Extensions/combined/dist/chrome/icons/icon48.png
+++ /dev/null
Binary files differ
diff --git a/Extensions/combined/dist/chrome/manifest.json b/Extensions/combined/dist/chrome/manifest.json
deleted file mode 100644
index bc00d83..0000000
--- a/Extensions/combined/dist/chrome/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "Return YouTube Dislike",
- "description": "Returns ability to see dislikes",
- "version": "2.0.0.3",
- "manifest_version": 3,
- "background": {
- "service_worker": "ryd.background.js"
- },
- "icons": {
- "48": "icons/icon48.png",
- "128": "icons/icon128.png"
- },
- "host_permissions": ["*://*.youtube.com/*"],
- "permissions": [
- "storage"
- ],
- "action": {
- "default_popup": "popup.html"
- },
- "content_scripts": [
- {
- "matches": [
- "*://youtube.com/*",
- "*://www.youtube.com/*",
- "*://m.youtube.com/*"
- ],
- "exclude_matches": ["*://*.music.youtube.com/*"],
- "js": ["bundled-content-script.js"],
- "css": ["content-style.css"]
- }
- ],
- "externally_connectable": {
- "matches": ["*://*.youtube.com/*"]
- },
- "web_accessible_resources": [
- {
- "resources": ["ryd.script.js"],
- "matches": ["*://*.youtube.com/*"]
- }
- ]
-}
diff --git a/Extensions/combined/dist/chrome/popup.css b/Extensions/combined/dist/chrome/popup.css
deleted file mode 100644
index 3075989..0000000
--- a/Extensions/combined/dist/chrome/popup.css
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Variables */
-:root {
- --primary: #cc2929;
- --accent: #581111;
-
- --background: #111;
- --secondary: #272727;
- --tertiary: #333333;
- --lightGrey: #999;
- --white: #fff;
-}
-
-/* Window Styling */
-html,
-body {
- background-color: var(--background);
- color: var(--white);
- min-width: 300px;
- padding: 0.5em;
- font-family: 'Roboto', Arial, Helvetica, sans-serif;
- font-size: 14px;
-}
-
-h1 {
- font-size: 26px;
-}
-
-button {
- color: var(--white);
- background: var(--secondary);
- cursor: pointer;
- padding: 5px 16px;
- border: none;
- border-radius: 4px;
- font-weight: 500;
- box-shadow: 0 2px 4px -1px rgb(0 0 0 / 20%), 0 4px 5px 0 rgb(0 0 0 / 14%), 0 1px 10px 0 rgb(0 0 0 / 12%);
- transition: .4s;
-}
-
-button:hover {
- background: #444;
-}
-
-#advancedToggle {
- margin-top: 1em;
- margin-bottom: 2em;
-}
-
-#advancedSettings {
- display: none;
- border: 2px solid var(--secondary);
- border-radius: 0.5rem;
- padding: 1rem;
-}
-
-#advancedLegend {
- color: var(--tertiary) !important;
- /* margin: auto; */ /* Center the label */
- /* padding: .25rem .5rem; */
- /* border-radius: .25rem; */
- /* border: .25rem solid var(--secondary); */
-}
-
-/* Switches */
-.switch {
- position: relative;
- display: inline-block;
- width: 30px;
- height: 17px;
- margin-bottom: 1rem;
-}
-
-.switch:last-of-type {
- margin-bottom: 0;
-}
-
-.switch input {
- display: none;
-}
-
-.slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: var(--secondary);
- transition: 0.4s;
- border-radius: 34px;
-}
-
-.slider:before {
- position: absolute;
- content: "";
- height: 13px;
- width: 13px;
- left: 2px;
- bottom: 2px;
- background: var(--lightGrey);
- transition: 0.4s;
- border-radius: 50%;
-}
-
-input:checked + .slider {
- background: var(--accent);
-}
-
-input:checked + .slider:before {
- transform: translateX(13px);
- background: var(--primary);
-}
-
-.switchLabel {
- margin-left: 0.5rem;
- width: 250px !important;
- transform: translateX(35px);
- display: inline-block;
-}
diff --git a/Extensions/combined/dist/chrome/popup.html b/Extensions/combined/dist/chrome/popup.html
deleted file mode 100644
index d97cd65..0000000
--- a/Extensions/combined/dist/chrome/popup.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta content="text/html; charset=utf-8" />
- <title>Return YouTube Dislike</title>
- <link rel="stylesheet" href="popup.css" />
- <link rel="preconnect" href="https://fonts.googleapis.com">
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
- </head>
- <body>
- <center>
- <svg width="48" viewBox="0 0 24 24"><path d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z" fill="red"/><path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff"/></svg>
- <h1>Return YouTube Dislike</h1>
- <p>by Dmitrii Selivanov & Community</p>
-
- <button id="link_website">Website</button>
- <button id="link_github">GitHub</button>
- <button id="link_discord">Discord</button>
-
- <br><br>
- <button id="link_donate">Donate</button>
- <br>
-
- <br>
-<!-- <button id="advancedToggle">Show Settings</button>-->
- <br>
-
- </center>
-
- <fieldset id="advancedSettings">
- <legend id="advancedLegend">Settings</legend>
-
- <label class="switch">
- <input type="checkbox" id="disable_ratio_bar" />
- <span class="slider" />
- <span class="switchLabel">Lorem ipsum dolor sit amet</span> </label
- ><br />
-
- <label class="switch">
- <input type="checkbox" id="disable_api_unlisted" />
- <span class="slider" />
- <span class="switchLabel">Lorem ipsum dolor sit amet</span> </label
- ><br />
- </fieldset>
- </body>
- <script src="popup.js"></script>
-</html>
diff --git a/Extensions/combined/dist/chrome/popup.js b/Extensions/combined/dist/chrome/popup.js
deleted file mode 100644
index c05ea5f..0000000
--- a/Extensions/combined/dist/chrome/popup.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Config */
-const config = {
- advanced: false,
- showAdvancedMessage: "Show Settings",
- hideAdvancedMessage: "Hide Settings",
-
- links: {
- website: "https://returnyoutubedislike.com",
- github: "https://github.com/Anarios/return-youtube-dislike",
- discord: "https://discord.gg/mYnESY4Md5",
- donate: 'https://returnyoutubedislike.com/donate'
- },
-};
-
-/* Links */
-document.getElementById("link_website").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.website });
-});
-
-document.getElementById("link_github").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.github });
-});
-
-document.getElementById("link_discord").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.discord });
-});
-
-document.getElementById("link_donate").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.donate });
-});
-
-
-chrome.runtime.sendMessage({ message: 'get_auth_token' });
-/* Advanced Toggle */
-/* Not currently used in this version
-const advancedToggle = document.getElementById("advancedToggle");
-advancedToggle.addEventListener("click", () => {
- const adv = document.getElementById("advancedSettings");
- if (config.advanced) {
- adv.style.display = "none";
- advancedToggle.innerHTML = config.showAdvancedMessage;
- config.advanced = false;
- } else {
- adv.style.display = "block";
- advancedToggle.innerHTML = config.hideAdvancedMessage;
- config.advanced = true;
- }
-});
-*/
-
-/* popup-script.js
-document.querySelector('#login')
-.addEventListener('click', function () {
- chrome.runtime.sendMessage({ message: 'get_auth_token' });
-});
-
-
-document.querySelector("#log_off").addEventListener("click", function () {
- chrome.runtime.sendMessage({ message: "log_off" });
-});
-*/
diff --git a/Extensions/combined/dist/chrome/ryd.background.js b/Extensions/combined/dist/chrome/ryd.background.js
deleted file mode 100644
index f2f8b36..0000000
--- a/Extensions/combined/dist/chrome/ryd.background.js
+++ /dev/null
@@ -1,220 +0,0 @@
-const apiUrl = "https://returnyoutubedislikeapi.com";
-let api;
-if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined")
- api = chrome;
-else if (
- typeof browser !== "undefined" &&
- typeof browser.runtime !== "undefined"
-)
- api = browser;
-
-api.runtime.onMessage.addListener((request, sender, sendResponse) => {
- if (request.message === "get_auth_token") {
- chrome.identity.getAuthToken({ interactive: true }, function (token) {
- console.log(token);
- chrome.identity.getProfileUserInfo(function (userInfo) {
- console.log(JSON.stringify(userInfo));
- });
- });
- } else if (request.message === "log_off") {
- // chrome.identity.clearAllCachedAuthTokens(() => console.log("logged off"));
- } else if (request.message == "set_state") {
- // chrome.identity.getAuthToken({ interactive: true }, function (token) {
- let token = "";
- fetch(`${apiUrl}/votes?videoId=${request.videoId}&likeCount=${request.likeCount || ''}`, {
- method: "GET",
- headers: {
- Accept: "application/json",
- },
- })
- .then((response) => response.json())
- .then((response) => {
- sendResponse(response);
- })
- .catch();
- return true;
- } else if (request.message == "send_links") {
- toSend = toSend.concat(request.videoIds.filter((x) => !sentIds.has(x)));
- if (toSend.length >= 20) {
- fetch(`${apiUrl}/votes`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(toSend),
- });
- for (const toSendUrl of toSend) {
- sentIds.add(toSendUrl);
- }
- toSend = [];
- }
- } else if (request.message == "register") {
- register();
- return true;
- } else if (request.message == "send_vote") {
- sendVote(request.videoId, request.vote);
- return true;
- }
-});
-
-async function sendVote(videoId, vote) {
- api.storage.sync.get(null, async (storageResult) => {
- if (!storageResult.userId || !storageResult.registrationConfirmed) {
- await register();
- return;
- }
- fetch(`${apiUrl}/interact/vote`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- userId: storageResult.userId,
- videoId,
- value: vote,
- }),
- })
- .then(async (response) => {
- if (response.status == 401) {
- await register();
- await sendVote(videoId, vote);
- return;
- }
- return response.json()
- })
- .then((response) => {
- solvePuzzle(response).then((solvedPuzzle) => {
- fetch(`${apiUrl}/interact/confirmVote`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- ...solvedPuzzle,
- userId: storageResult.userId,
- videoId,
- }),
- });
- });
- });
- });
-}
-
-function register() {
- let userId = generateUserID();
- api.storage.sync.set({ userId });
- return fetch(`${apiUrl}/puzzle/registration?userId=${userId}`, {
- method: "GET",
- headers: {
- Accept: "application/json",
- },
- })
- .then((response) => response.json())
- .then((response) => {
- return solvePuzzle(response).then((solvedPuzzle) => {
- return fetch(`${apiUrl}/puzzle/registration?userId=${userId}`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(solvedPuzzle),
- }).then((response) =>
- response.json().then((result) => {
- if (result === true) {
- return api.storage.sync.set({ registrationConfirmed: true });
- }
- })
- );
- });
- })
- .catch();
-}
-
-api.storage.sync.get(null, (res) => {
- if (!res || !res.userId || !res.registrationConfirmed) {
- register();
- }
-});
-
-const sentIds = new Set();
-let toSend = [];
-
-function sendUserSubmittedStatisticsToApi(statistics) {
- fetch(`${apiUrl}/votes/user-submitted`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(statistics),
- });
-}
-
-function countLeadingZeroes(uInt8View, limit) {
- let zeroes = 0;
- let value = 0;
- for (let i = 0; i < uInt8View.length; i++) {
- value = uInt8View[i];
- if (value === 0) {
- zeroes += 8;
- } else {
- let count = 1;
- if (value >>> 4 === 0) {
- count += 4;
- value <<= 4;
- }
- if (value >>> 6 === 0) {
- count += 2;
- value <<= 2;
- }
- zeroes += count - (value >>> 7);
- break;
- }
- if (zeroes >= limit) {
- break;
- }
- }
- return zeroes;
-}
-
-async function solvePuzzle(puzzle) {
- let challenge = Uint8Array.from(atob(puzzle.challenge), (c) =>
- c.charCodeAt(0)
- );
- let buffer = new ArrayBuffer(20);
- let uInt8View = new Uint8Array(buffer);
- let uInt32View = new Uint32Array(buffer);
- let maxCount = Math.pow(2, puzzle.difficulty) * 5;
- for (let i = 4; i < 20; i++) {
- uInt8View[i] = challenge[i - 4];
- }
-
- for (let i = 0; i < maxCount; i++) {
- uInt32View[0] = i;
- let hash = await crypto.subtle.digest("SHA-512", buffer);
- let hashUint8 = new Uint8Array(hash);
- if (countLeadingZeroes(hashUint8) >= puzzle.difficulty) {
- return {
- solution: btoa(String.fromCharCode.apply(null, uInt8View.slice(0, 4))),
- };
- }
- }
-}
-
-function generateUserID(length = 36) {
- const charset =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- let result = "";
- if (crypto && crypto.getRandomValues) {
- const values = new Uint32Array(length);
- crypto.getRandomValues(values);
- for (let i = 0; i < length; i++) {
- result += charset[values[i] % charset.length];
- }
- return result;
- } else {
- for (let i = 0; i < length; i++) {
- result += charset[Math.floor(Math.random() * charset.length)];
- }
- return result;
- }
-}
diff --git a/Extensions/combined/dist/firefox/bundled-content-script.js b/Extensions/combined/dist/firefox/bundled-content-script.js
deleted file mode 100644
index 4685457..0000000
--- a/Extensions/combined/dist/firefox/bundled-content-script.js
+++ /dev/null
@@ -1,361 +0,0 @@
-/******/ (() => { // webpackBootstrap
-/******/ "use strict";
-var __webpack_exports__ = {};
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/bar.js
-
-
-function createRateBar(likes, dislikes) {
- var rateBar = document.getElementById("ryd-bar-container");
- var widthPx = buttons_getButtons().children[0].clientWidth + buttons_getButtons().children[1].clientWidth + 8;
- var widthPercent = likes + dislikes > 0 ? likes / (likes + dislikes) * 100 : 50;
-
- if (!rateBar) {
- (document.getElementById("menu-container") || document.querySelector("ytm-slim-video-action-bar-renderer")).insertAdjacentHTML("beforeend", "\n <div class=\"ryd-tooltip\" style=\"width: ".concat(widthPx, "px\">\n <div class=\"ryd-tooltip-bar-container\">\n <div\n id=\"ryd-bar-container\"\n style=\"width: 100%; height: 2px;\"\n >\n <div\n id=\"ryd-bar\"\n style=\"width: ").concat(widthPercent, "%; height: 100%\"\n ></div>\n </div>\n </div>\n <tp-yt-paper-tooltip position=\"top\" id=\"ryd-dislike-tooltip\" class=\"style-scope ytd-sentiment-bar-renderer\" role=\"tooltip\" tabindex=\"-1\">\n <!--css-build:shady-->").concat(likes.toLocaleString(), "&nbsp;/&nbsp;").concat(dislikes.toLocaleString(), "\n </tp-yt-paper-tooltip>\n </div>\n "));
- } else {
- document.getElementById("ryd-bar-container").style.width = widthPx + "px";
- document.getElementById("ryd-bar").style.width = widthPercent + "%";
- document.querySelector("#ryd-dislike-tooltip > #tooltip").innerHTML = "".concat(likes.toLocaleString(), "&nbsp;/&nbsp;").concat(dislikes.toLocaleString());
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/utils.js
-function roundDown(num) {
- if (num < 1000) return num;
-
- var _int = Math.floor(Math.log10(num) - 2);
-
- var decimal = _int + (_int % 3 ? 1 : 0);
- var value = Math.floor(num / Math.pow(10, decimal));
- return value * Math.pow(10, decimal);
-}
-
-function numberFormat(numberState) {
- var userLocales;
-
- try {
- var _URL, _URL$searchParams, _Array$from, _Array$from$find;
-
- userLocales = (_URL = new URL((_Array$from = Array.from(document.querySelectorAll("head > link[rel='search']"))) === null || _Array$from === void 0 ? void 0 : (_Array$from$find = _Array$from.find(function (n) {
- var _n$getAttribute;
-
- return n === null || n === void 0 ? void 0 : (_n$getAttribute = n.getAttribute("href")) === null || _n$getAttribute === void 0 ? void 0 : _n$getAttribute.includes("?locale=");
- })) === null || _Array$from$find === void 0 ? void 0 : _Array$from$find.getAttribute("href"))) === null || _URL === void 0 ? void 0 : (_URL$searchParams = _URL.searchParams) === null || _URL$searchParams === void 0 ? void 0 : _URL$searchParams.get("locale");
- } catch (_unused) {}
-
- var formatter = Intl.NumberFormat(document.documentElement.lang || userLocales || navigator.language, {
- notation: "compact"
- });
- return formatter.format(roundDown(numberState));
-}
-
-function getBrowser() {
- if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
- return chrome;
- } else if (typeof browser !== "undefined" && typeof browser.runtime !== "undefined") {
- return browser;
- } else {
- console.log("browser is not supported");
- return false;
- }
-}
-
-function getVideoId(url) {
- var urlObject = new URL(url);
- var pathname = urlObject.pathname;
-
- if (pathname.startsWith("/clip")) {
- return document.querySelector("meta[itemprop='videoId']").content;
- } else {
- return urlObject.searchParams.get("v");
- }
-}
-
-function isVideoLoaded() {
- var videoId = getVideoId(window.location.href);
- return document.querySelector("ytd-watch-flexy[video-id='".concat(videoId, "']")) !== null || // mobile: no video-id attribute
- document.querySelector('#player[loading="false"]:not([hidden])') !== null;
-}
-
-function cLog(message, writer) {
- message = "[return youtube dislike]: ".concat(message);
-
- if (writer) {
- writer(message);
- } else {
- console.log(message);
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/events.js
-
-
-
-
-
-function sendVote(vote) {
- getBrowser().runtime.sendMessage({
- message: "send_vote",
- vote: vote,
- videoId: getVideoId(window.location.href)
- });
-}
-
-function sendVideoIds() {
- var links = Array.from(document.getElementsByClassName("yt-simple-endpoint ytd-compact-video-renderer")).concat(Array.from(document.getElementsByClassName("yt-simple-endpoint ytd-thumbnail"))); // Also try mobile
-
- if (links.length < 1) links = Array.from(document.querySelectorAll(".large-media-item-metadata > a, a.large-media-item-thumbnail-container"));
- var ids = links.filter(function (x) {
- return x.href && x.href.indexOf("/watch?v=") > 0;
- }).map(function (x) {
- return getVideoId(x.href);
- });
- getBrowser().runtime.sendMessage({
- message: "send_links",
- videoIds: ids
- });
-}
-
-function likeClicked(storedData) {
- if (checkForSignInButton() === false) {
- if (storedData.previousState === DISLIKED_STATE) {
- sendVote(1);
- storedData.dislikes--;
- storedData.likes++;
- createRateBar(storedData.likes, storedData.dislikes);
- setDislikes(numberFormat(storedData.dislikes));
- storedData.previousState = LIKED_STATE;
- } else if (storedData.previousState === NEUTRAL_STATE) {
- sendVote(1);
- storedData.likes++;
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = LIKED_STATE;
- } else if (storedData.previousState = LIKED_STATE) {
- sendVote(0);
- storedData.likes--;
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = NEUTRAL_STATE;
- }
- }
-}
-
-function dislikeClicked(storedData) {
- if (checkForSignInButton() == false) {
- if (storedData.previousState === NEUTRAL_STATE) {
- sendVote(-1);
- storedData.dislikes++;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = DISLIKED_STATE;
- } else if (storedData.previousState === DISLIKED_STATE) {
- sendVote(0);
- storedData.dislikes--;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = NEUTRAL_STATE;
- } else if (storedData.previousState === LIKED_STATE) {
- sendVote(-1);
- storedData.likes--;
- storedData.dislikes++;
- setDislikes(numberFormat(storedData.dislikes));
- createRateBar(storedData.likes, storedData.dislikes);
- storedData.previousState = DISLIKED_STATE;
- }
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/state.js
-
-
-
-
-var LIKED_STATE = "LIKED_STATE";
-var DISLIKED_STATE = "DISLIKED_STATE";
-var NEUTRAL_STATE = "NEUTRAL_STATE";
-
-function isMobile() {
- return location.hostname == "m.youtube.com";
-}
-
-function isVideoLiked() {
- if (isMobile()) {
- return getLikeButton().querySelector("button").getAttribute("aria-label") == "true";
- }
-
- return getLikeButton().classList.contains("style-default-active");
-}
-
-function isVideoDisliked() {
- if (isMobile()) {
- return getDislikeButton().querySelector("button").getAttribute("aria-label") == "true";
- }
-
- return getDislikeButton().classList.contains("style-default-active");
-}
-
-function getState(storedData) {
- if (isVideoLiked()) {
- return {
- current: LIKED_STATE,
- previous: storedData.previousState
- };
- }
-
- if (isVideoDisliked()) {
- return {
- current: DISLIKED_STATE,
- previous: storedData.previousState
- };
- }
-
- return {
- current: NEUTRAL_STATE,
- previous: storedData.previousState
- };
-} //--- Sets The Likes And Dislikes Values ---//
-
-
-function setLikes(likesCount) {
- getButtons().children[0].querySelector("#text").innerText = likesCount;
-}
-
-function setDislikes(dislikesCount) {
- if (isMobile()) {
- buttons_getButtons().children[1].querySelector(".button-renderer-text").innerText = dislikesCount;
- return;
- }
-
- buttons_getButtons().children[1].querySelector("#text").innerText = dislikesCount;
-}
-
-function getLikeCountFromButton() {
- var likesStr = getLikeButton().querySelector("button").getAttribute("aria-label").replace(/\D/g, "");
- return likesStr.length > 0 ? parseInt(likesStr) : false;
-}
-
-function processResponse(response, storedData) {
- var formattedDislike = numberFormat(response.dislikes);
- setDislikes(formattedDislike);
- storedData.dislikes = parseInt(response.dislikes);
- storedData.likes = getLikeCountFromButton() || parseInt(response.likes);
- createRateBar(storedData.likes, storedData.dislikes);
-}
-
-function setState(storedData) {
- storedData.previousState = isVideoDisliked() ? DISLIKED_STATE : isVideoLiked() ? LIKED_STATE : NEUTRAL_STATE;
- var statsSet = false;
- getBrowser().runtime.sendMessage({
- message: "set_state",
- videoId: getVideoId(window.location.href),
- state: getState(storedData).current,
- likeCount: getLikeCountFromButton() || null
- }, function (response) {
- cLog("response from api:");
- cLog(JSON.stringify(response));
-
- if (response !== undefined && !("traceId" in response) && !statsSet) {
- processResponse(response, storedData);
- } else {}
- });
-}
-
-function setInitialState(storedData) {
- setState(storedData);
- setTimeout(function () {
- sendVideoIds();
- }, 1500);
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/src/buttons.js
-
-
-function buttons_getButtons() {
- var _document$getElementB;
-
- if (isMobile()) {
- return document.querySelector(".slim-video-action-bar-actions");
- } //--- If Menu Element Is Displayed: ---//
-
-
- if (((_document$getElementB = document.getElementById("menu-container")) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.offsetParent) === null) {
- return document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div"); //--- If Menu Element Isnt Displayed: ---//
- } else {
- var _document$getElementB2;
-
- return (_document$getElementB2 = document.getElementById("menu-container")) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.querySelector("#top-level-buttons-computed");
- }
-}
-
-function getLikeButton() {
- return buttons_getButtons().children[0];
-}
-
-function getDislikeButton() {
- return buttons_getButtons().children[1];
-}
-
-function checkForSignInButton() {
- if (document.querySelector("a[href^='https://accounts.google.com/ServiceLogin']")) {
- return true;
- } else {
- return false;
- }
-}
-
-
-;// CONCATENATED MODULE: ./Extensions/combined/ryd.content-script.js
-
-
-
-
-
-var storedData = {
- likes: 0,
- dislikes: 0,
- previousState: NEUTRAL_STATE
-};
-var jsInitChecktimer = null;
-
-function setEventListeners(evt) {
- function checkForJS_Finish() {
- var _getButtons;
-
- if ((_getButtons = buttons_getButtons()) !== null && _getButtons !== void 0 && _getButtons.offsetParent && isVideoLoaded()) {
- clearInterval(jsInitChecktimer);
- jsInitChecktimer = null;
- var buttons = buttons_getButtons();
-
- if (!window.returnDislikeButtonlistenersSet) {
- buttons.children[0].addEventListener("click", function () {
- return likeClicked(storedData);
- });
- buttons.children[1].addEventListener("click", function () {
- return dislikeClicked(storedData);
- });
- window.returnDislikeButtonlistenersSet = true;
- }
-
- setInitialState(storedData);
- }
- }
-
- if (window.location.href.indexOf("watch?") >= 0) {
- jsInitChecktimer = setInterval(checkForJS_Finish, 111);
- }
-}
-
-setEventListeners();
-document.addEventListener("yt-navigate-finish", function (event) {
- if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
- window.returnDislikeButtonlistenersSet = false;
- setEventListeners();
-});
-setTimeout(function () {
- return sendVideoIds();
-}, 2500);
-/******/ })()
-; \ No newline at end of file
diff --git a/Extensions/combined/dist/firefox/content-style.css b/Extensions/combined/dist/firefox/content-style.css
deleted file mode 100644
index c06b29c..0000000
--- a/Extensions/combined/dist/firefox/content-style.css
+++ /dev/null
@@ -1,26 +0,0 @@
-#ryd-bar-container {
- background: var(--yt-spec-icon-disabled);
- border-radius: 2px;
-}
-
-#ryd-bar {
- background: var(--yt-spec-text-primary);
- border-radius: 2px;
- transition: all 0.15s ease-in-out;
-}
-
-.ryd-tooltip {
- position: relative;
- display: block;
- height: 2px;
- top: 9px;
-}
-
-.ryd-tooltip-bar-container {
- width: 100%;
- height: 2px;
- position: absolute;
- padding-top: 6px;
- padding-bottom: 28px;
- top: -6px;
-}
diff --git a/Extensions/combined/dist/firefox/icons/icon128.png b/Extensions/combined/dist/firefox/icons/icon128.png
deleted file mode 100644
index 23b4958..0000000
--- a/Extensions/combined/dist/firefox/icons/icon128.png
+++ /dev/null
Binary files differ
diff --git a/Extensions/combined/dist/firefox/icons/icon48.png b/Extensions/combined/dist/firefox/icons/icon48.png
deleted file mode 100644
index f2a5951..0000000
--- a/Extensions/combined/dist/firefox/icons/icon48.png
+++ /dev/null
Binary files differ
diff --git a/Extensions/combined/dist/firefox/manifest.json b/Extensions/combined/dist/firefox/manifest.json
deleted file mode 100644
index c0f2941..0000000
--- a/Extensions/combined/dist/firefox/manifest.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "Return YouTube Dislike",
- "description": "Returns ability to see dislikes",
- "version": "2.0.0.3",
- "manifest_version": 2,
- "background": {
- "scripts": ["ryd.background.js"]
- },
- "icons": {
- "48": "icons/icon48.png",
- "128": "icons/icon128.png"
- },
- "permissions": ["activeTab", "*://*.youtube.com/*", "storage"],
- "browser_action": {
- "default_popup": "popup.html"
- },
- "content_scripts": [
- {
- "matches": ["*://*.youtube.com/*"],
- "exclude_matches": ["*://*.music.youtube.com/*"],
- "run_at": "document_idle",
- "css": ["content-style.css"],
- "js": ["bundled-content-script.js"]
- }
- ]
-}
diff --git a/Extensions/combined/dist/firefox/popup.css b/Extensions/combined/dist/firefox/popup.css
deleted file mode 100644
index 3075989..0000000
--- a/Extensions/combined/dist/firefox/popup.css
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Variables */
-:root {
- --primary: #cc2929;
- --accent: #581111;
-
- --background: #111;
- --secondary: #272727;
- --tertiary: #333333;
- --lightGrey: #999;
- --white: #fff;
-}
-
-/* Window Styling */
-html,
-body {
- background-color: var(--background);
- color: var(--white);
- min-width: 300px;
- padding: 0.5em;
- font-family: 'Roboto', Arial, Helvetica, sans-serif;
- font-size: 14px;
-}
-
-h1 {
- font-size: 26px;
-}
-
-button {
- color: var(--white);
- background: var(--secondary);
- cursor: pointer;
- padding: 5px 16px;
- border: none;
- border-radius: 4px;
- font-weight: 500;
- box-shadow: 0 2px 4px -1px rgb(0 0 0 / 20%), 0 4px 5px 0 rgb(0 0 0 / 14%), 0 1px 10px 0 rgb(0 0 0 / 12%);
- transition: .4s;
-}
-
-button:hover {
- background: #444;
-}
-
-#advancedToggle {
- margin-top: 1em;
- margin-bottom: 2em;
-}
-
-#advancedSettings {
- display: none;
- border: 2px solid var(--secondary);
- border-radius: 0.5rem;
- padding: 1rem;
-}
-
-#advancedLegend {
- color: var(--tertiary) !important;
- /* margin: auto; */ /* Center the label */
- /* padding: .25rem .5rem; */
- /* border-radius: .25rem; */
- /* border: .25rem solid var(--secondary); */
-}
-
-/* Switches */
-.switch {
- position: relative;
- display: inline-block;
- width: 30px;
- height: 17px;
- margin-bottom: 1rem;
-}
-
-.switch:last-of-type {
- margin-bottom: 0;
-}
-
-.switch input {
- display: none;
-}
-
-.slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: var(--secondary);
- transition: 0.4s;
- border-radius: 34px;
-}
-
-.slider:before {
- position: absolute;
- content: "";
- height: 13px;
- width: 13px;
- left: 2px;
- bottom: 2px;
- background: var(--lightGrey);
- transition: 0.4s;
- border-radius: 50%;
-}
-
-input:checked + .slider {
- background: var(--accent);
-}
-
-input:checked + .slider:before {
- transform: translateX(13px);
- background: var(--primary);
-}
-
-.switchLabel {
- margin-left: 0.5rem;
- width: 250px !important;
- transform: translateX(35px);
- display: inline-block;
-}
diff --git a/Extensions/combined/dist/firefox/popup.html b/Extensions/combined/dist/firefox/popup.html
deleted file mode 100644
index d97cd65..0000000
--- a/Extensions/combined/dist/firefox/popup.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta content="text/html; charset=utf-8" />
- <title>Return YouTube Dislike</title>
- <link rel="stylesheet" href="popup.css" />
- <link rel="preconnect" href="https://fonts.googleapis.com">
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
- </head>
- <body>
- <center>
- <svg width="48" viewBox="0 0 24 24"><path d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z" fill="red"/><path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff"/></svg>
- <h1>Return YouTube Dislike</h1>
- <p>by Dmitrii Selivanov & Community</p>
-
- <button id="link_website">Website</button>
- <button id="link_github">GitHub</button>
- <button id="link_discord">Discord</button>
-
- <br><br>
- <button id="link_donate">Donate</button>
- <br>
-
- <br>
-<!-- <button id="advancedToggle">Show Settings</button>-->
- <br>
-
- </center>
-
- <fieldset id="advancedSettings">
- <legend id="advancedLegend">Settings</legend>
-
- <label class="switch">
- <input type="checkbox" id="disable_ratio_bar" />
- <span class="slider" />
- <span class="switchLabel">Lorem ipsum dolor sit amet</span> </label
- ><br />
-
- <label class="switch">
- <input type="checkbox" id="disable_api_unlisted" />
- <span class="slider" />
- <span class="switchLabel">Lorem ipsum dolor sit amet</span> </label
- ><br />
- </fieldset>
- </body>
- <script src="popup.js"></script>
-</html>
diff --git a/Extensions/combined/dist/firefox/popup.js b/Extensions/combined/dist/firefox/popup.js
deleted file mode 100644
index c05ea5f..0000000
--- a/Extensions/combined/dist/firefox/popup.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Config */
-const config = {
- advanced: false,
- showAdvancedMessage: "Show Settings",
- hideAdvancedMessage: "Hide Settings",
-
- links: {
- website: "https://returnyoutubedislike.com",
- github: "https://github.com/Anarios/return-youtube-dislike",
- discord: "https://discord.gg/mYnESY4Md5",
- donate: 'https://returnyoutubedislike.com/donate'
- },
-};
-
-/* Links */
-document.getElementById("link_website").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.website });
-});
-
-document.getElementById("link_github").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.github });
-});
-
-document.getElementById("link_discord").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.discord });
-});
-
-document.getElementById("link_donate").addEventListener("click", () => {
- chrome.tabs.create({ url: config.links.donate });
-});
-
-
-chrome.runtime.sendMessage({ message: 'get_auth_token' });
-/* Advanced Toggle */
-/* Not currently used in this version
-const advancedToggle = document.getElementById("advancedToggle");
-advancedToggle.addEventListener("click", () => {
- const adv = document.getElementById("advancedSettings");
- if (config.advanced) {
- adv.style.display = "none";
- advancedToggle.innerHTML = config.showAdvancedMessage;
- config.advanced = false;
- } else {
- adv.style.display = "block";
- advancedToggle.innerHTML = config.hideAdvancedMessage;
- config.advanced = true;
- }
-});
-*/
-
-/* popup-script.js
-document.querySelector('#login')
-.addEventListener('click', function () {
- chrome.runtime.sendMessage({ message: 'get_auth_token' });
-});
-
-
-document.querySelector("#log_off").addEventListener("click", function () {
- chrome.runtime.sendMessage({ message: "log_off" });
-});
-*/
diff --git a/Extensions/combined/dist/firefox/ryd.background.js b/Extensions/combined/dist/firefox/ryd.background.js
deleted file mode 100644
index f2f8b36..0000000
--- a/Extensions/combined/dist/firefox/ryd.background.js
+++ /dev/null
@@ -1,220 +0,0 @@
-const apiUrl = "https://returnyoutubedislikeapi.com";
-let api;
-if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined")
- api = chrome;
-else if (
- typeof browser !== "undefined" &&
- typeof browser.runtime !== "undefined"
-)
- api = browser;
-
-api.runtime.onMessage.addListener((request, sender, sendResponse) => {
- if (request.message === "get_auth_token") {
- chrome.identity.getAuthToken({ interactive: true }, function (token) {
- console.log(token);
- chrome.identity.getProfileUserInfo(function (userInfo) {
- console.log(JSON.stringify(userInfo));
- });
- });
- } else if (request.message === "log_off") {
- // chrome.identity.clearAllCachedAuthTokens(() => console.log("logged off"));
- } else if (request.message == "set_state") {
- // chrome.identity.getAuthToken({ interactive: true }, function (token) {
- let token = "";
- fetch(`${apiUrl}/votes?videoId=${request.videoId}&likeCount=${request.likeCount || ''}`, {
- method: "GET",
- headers: {
- Accept: "application/json",
- },
- })
- .then((response) => response.json())
- .then((response) => {
- sendResponse(response);
- })
- .catch();
- return true;
- } else if (request.message == "send_links") {
- toSend = toSend.concat(request.videoIds.filter((x) => !sentIds.has(x)));
- if (toSend.length >= 20) {
- fetch(`${apiUrl}/votes`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(toSend),
- });
- for (const toSendUrl of toSend) {
- sentIds.add(toSendUrl);
- }
- toSend = [];
- }
- } else if (request.message == "register") {
- register();
- return true;
- } else if (request.message == "send_vote") {
- sendVote(request.videoId, request.vote);
- return true;
- }
-});
-
-async function sendVote(videoId, vote) {
- api.storage.sync.get(null, async (storageResult) => {
- if (!storageResult.userId || !storageResult.registrationConfirmed) {
- await register();
- return;
- }
- fetch(`${apiUrl}/interact/vote`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- userId: storageResult.userId,
- videoId,
- value: vote,
- }),
- })
- .then(async (response) => {
- if (response.status == 401) {
- await register();
- await sendVote(videoId, vote);
- return;
- }
- return response.json()
- })
- .then((response) => {
- solvePuzzle(response).then((solvedPuzzle) => {
- fetch(`${apiUrl}/interact/confirmVote`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- ...solvedPuzzle,
- userId: storageResult.userId,
- videoId,
- }),
- });
- });
- });
- });
-}
-
-function register() {
- let userId = generateUserID();
- api.storage.sync.set({ userId });
- return fetch(`${apiUrl}/puzzle/registration?userId=${userId}`, {
- method: "GET",
- headers: {
- Accept: "application/json",
- },
- })
- .then((response) => response.json())
- .then((response) => {
- return solvePuzzle(response).then((solvedPuzzle) => {
- return fetch(`${apiUrl}/puzzle/registration?userId=${userId}`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(solvedPuzzle),
- }).then((response) =>
- response.json().then((result) => {
- if (result === true) {
- return api.storage.sync.set({ registrationConfirmed: true });
- }
- })
- );
- });
- })
- .catch();
-}
-
-api.storage.sync.get(null, (res) => {
- if (!res || !res.userId || !res.registrationConfirmed) {
- register();
- }
-});
-
-const sentIds = new Set();
-let toSend = [];
-
-function sendUserSubmittedStatisticsToApi(statistics) {
- fetch(`${apiUrl}/votes/user-submitted`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(statistics),
- });
-}
-
-function countLeadingZeroes(uInt8View, limit) {
- let zeroes = 0;
- let value = 0;
- for (let i = 0; i < uInt8View.length; i++) {
- value = uInt8View[i];
- if (value === 0) {
- zeroes += 8;
- } else {
- let count = 1;
- if (value >>> 4 === 0) {
- count += 4;
- value <<= 4;
- }
- if (value >>> 6 === 0) {
- count += 2;
- value <<= 2;
- }
- zeroes += count - (value >>> 7);
- break;
- }
- if (zeroes >= limit) {
- break;
- }
- }
- return zeroes;
-}
-
-async function solvePuzzle(puzzle) {
- let challenge = Uint8Array.from(atob(puzzle.challenge), (c) =>
- c.charCodeAt(0)
- );
- let buffer = new ArrayBuffer(20);
- let uInt8View = new Uint8Array(buffer);
- let uInt32View = new Uint32Array(buffer);
- let maxCount = Math.pow(2, puzzle.difficulty) * 5;
- for (let i = 4; i < 20; i++) {
- uInt8View[i] = challenge[i - 4];
- }
-
- for (let i = 0; i < maxCount; i++) {
- uInt32View[0] = i;
- let hash = await crypto.subtle.digest("SHA-512", buffer);
- let hashUint8 = new Uint8Array(hash);
- if (countLeadingZeroes(hashUint8) >= puzzle.difficulty) {
- return {
- solution: btoa(String.fromCharCode.apply(null, uInt8View.slice(0, 4))),
- };
- }
- }
-}
-
-function generateUserID(length = 36) {
- const charset =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- let result = "";
- if (crypto && crypto.getRandomValues) {
- const values = new Uint32Array(length);
- crypto.getRandomValues(values);
- for (let i = 0; i < length; i++) {
- result += charset[values[i] % charset.length];
- }
- return result;
- } else {
- for (let i = 0; i < length; i++) {
- result += charset[Math.floor(Math.random() * charset.length)];
- }
- return result;
- }
-}
diff --git a/Extensions/combined/icons/server.svg b/Extensions/combined/icons/server.svg
new file mode 100644
index 0000000..869a391
--- /dev/null
+++ b/Extensions/combined/icons/server.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z"/></svg> \ No newline at end of file
diff --git a/Extensions/combined/manifest-chrome.json b/Extensions/combined/manifest-chrome.json
index bc00d83..d1cf586 100644
--- a/Extensions/combined/manifest-chrome.json
+++ b/Extensions/combined/manifest-chrome.json
@@ -27,6 +27,10 @@
"exclude_matches": ["*://*.music.youtube.com/*"],
"js": ["bundled-content-script.js"],
"css": ["content-style.css"]
+ },
+ {
+ "matches": ["*://*.returnyoutubedislike.com/debug","http://localhost/debug"],
+ "js": ["debug.js"]
}
],
"externally_connectable": {
diff --git a/Extensions/combined/manifest-firefox.json b/Extensions/combined/manifest-firefox.json
index c0f2941..e0e8dba 100644
--- a/Extensions/combined/manifest-firefox.json
+++ b/Extensions/combined/manifest-firefox.json
@@ -21,6 +21,11 @@
"run_at": "document_idle",
"css": ["content-style.css"],
"js": ["bundled-content-script.js"]
+ },
+ {
+ "matches": ["*://*.returnyoutubedislike.com/debug","http://localhost/debug"],
+ "run_at": "document_idle",
+ "js": ["debug.js"]
}
]
}
diff --git a/Extensions/combined/popup.css b/Extensions/combined/popup.css
index 3075989..757692d 100644
--- a/Extensions/combined/popup.css
+++ b/Extensions/combined/popup.css
@@ -17,7 +17,7 @@ body {
color: var(--white);
min-width: 300px;
padding: 0.5em;
- font-family: 'Roboto', Arial, Helvetica, sans-serif;
+ font-family: "Roboto", Arial, Helvetica, sans-serif;
font-size: 14px;
}
@@ -33,8 +33,9 @@ button {
border: none;
border-radius: 4px;
font-weight: 500;
- box-shadow: 0 2px 4px -1px rgb(0 0 0 / 20%), 0 4px 5px 0 rgb(0 0 0 / 14%), 0 1px 10px 0 rgb(0 0 0 / 12%);
- transition: .4s;
+ box-shadow: 0 2px 4px -1px rgb(0 0 0 / 20%), 0 4px 5px 0 rgb(0 0 0 / 14%),
+ 0 1px 10px 0 rgb(0 0 0 / 12%);
+ transition: 0.4s;
}
button:hover {
@@ -117,3 +118,10 @@ input:checked + .slider:before {
transform: translateX(35px);
display: inline-block;
}
+
+#server-status {
+ height: 72px;
+ width: 90px;
+ /* filter: invert(21%) sepia(100%) saturate(3618%) hue-rotate(102deg)
+ brightness(96%) contrast(108%); */
+}
diff --git a/Extensions/combined/popup.html b/Extensions/combined/popup.html
index 27910d2..130f557 100644
--- a/Extensions/combined/popup.html
+++ b/Extensions/combined/popup.html
@@ -4,14 +4,25 @@
<meta content="text/html; charset=utf-8" />
<title>Return YouTube Dislike</title>
<link rel="stylesheet" href="popup.css" />
- <link rel="preconnect" href="https://fonts.googleapis.com">
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+ <link
+ href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap"
+ rel="stylesheet"
+ />
</head>
<body>
<center>
- <svg width="48" viewBox="0 0 24 24"><path d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z" fill="red"/><path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff"/></svg>
+ <svg width="48" viewBox="0 0 24 24">
+ <path
+ d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z"
+ fill="red"
+ />
+ <path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff" />
+ </svg>
<h1>Return YouTube Dislike</h1>
+ <img id="server-status" src="./icons/server.svg" alt="" />
+ <p>API Status: <span id="status"></span></p>
<p>by Dmitrii Selivanov & Community</p>
<p id="ext-version"></p>
@@ -19,15 +30,14 @@
<button id="link_github">GitHub</button>
<button id="link_discord">Discord</button>
- <br><br>
- <button id="link_faq">FAQ</button>
+ <br /><br />
+ <button id="link_faq">FAQ</button>
<button id="link_donate">Donate</button>
- <br>
+ <br />
- <br>
+ <br />
<button id="advancedToggle">Show Settings</button>
- <br>
-
+ <br />
</center>
<fieldset id="advancedSettings">
@@ -38,7 +48,7 @@
<span class="slider" />
<span class="switchLabel">Disable like/dislike submission</span>
</label>
- <br/>
+ <br />
<!-- <label class="switch">
<input type="checkbox" id="disable_api_unlisted" />
diff --git a/Extensions/combined/popup.js b/Extensions/combined/popup.js
index c0e7b78..1e3264a 100644
--- a/Extensions/combined/popup.js
+++ b/Extensions/combined/popup.js
@@ -4,23 +4,13 @@ const config = {
showAdvancedMessage: "Show Settings",
hideAdvancedMessage: "Hide Settings",
disableVoteSubmission: false,
-}
-
- function initConfig() {
- initializeVersionNumber();
- }
-
- function initializeVersionNumber() {
- const version = chrome.runtime.getManifest().version;
- document.getElementById('ext-version').innerHTML = 'v' + version;
-}
links: {
website: "https://returnyoutubedislike.com",
github: "https://github.com/Anarios/return-youtube-dislike",
discord: "https://discord.gg/mYnESY4Md5",
- donate: 'https://returnyoutubedislike.com/donate',
- faq: 'https://returnyoutubedislike.com/faq'
+ donate: "https://returnyoutubedislike.com/donate",
+ faq: "https://returnyoutubedislike.com/faq",
},
};
@@ -45,10 +35,11 @@ document.getElementById("link_donate").addEventListener("click", () => {
chrome.tabs.create({ url: config.links.donate });
});
-
-document.getElementById("disable_vote_submission").addEventListener("click", (ev) => {
- chrome.storage.sync.set({ disableVoteSubmission: ev.target.checked });
-});
+document
+ .getElementById("disable_vote_submission")
+ .addEventListener("click", (ev) => {
+ chrome.storage.sync.set({ disableVoteSubmission: ev.target.checked });
+ });
/* Advanced Toggle */
const advancedToggle = document.getElementById("advancedToggle");
@@ -69,10 +60,16 @@ initConfig();
function initConfig() {
initializeDisableVoteSubmission();
+ initializeVersionNumber();
+}
+
+function initializeVersionNumber() {
+ const version = chrome.runtime.getManifest().version;
+ document.getElementById('ext-version').innerHTML = 'v' + version;
}
function initializeDisableVoteSubmission() {
- chrome.storage.sync.get(['disableVoteSubmission'], (res) => {
+ chrome.storage.sync.get(["disableVoteSubmission"], (res) => {
handleDisableVoteSubmissionChangeEvent(res.disableVoteSubmission);
});
}
@@ -81,7 +78,9 @@ chrome.storage.onChanged.addListener(storageChangeHandler);
function storageChangeHandler(changes, area) {
if (changes.disableVoteSubmission !== undefined) {
- handleDisableVoteSubmissionChangeEvent(changes.disableVoteSubmission.newValue);
+ handleDisableVoteSubmissionChangeEvent(
+ changes.disableVoteSubmission.newValue
+ );
}
}
@@ -90,6 +89,26 @@ function handleDisableVoteSubmissionChangeEvent(value) {
document.getElementById("disable_vote_submission").checked = value;
}
+(async function getStatus() {
+ let status = document.getElementById("status");
+ let serverStatus = document.getElementById("server-status");
+ let resp = await fetch(
+ "https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g"
+ );
+ let result = await resp.status;
+ if (result === 200) {
+ status.innerText = "Online";
+ status.style.color = "green";
+ serverStatus.style.filter =
+ "invert(58%) sepia(81%) saturate(2618%) hue-rotate(81deg) brightness(119%) contrast(129%)";
+ } else {
+ status.innerText = "Offline";
+ status.style.color = "red";
+ serverStatus.style.filter =
+ "invert(11%) sepia(100%) saturate(6449%) hue-rotate(3deg) brightness(116%) contrast(115%)";
+ }
+})();
+
/* popup-script.js
document.querySelector('#login')
.addEventListener('click', function () {
diff --git a/Extensions/combined/src/events.js b/Extensions/combined/src/events.js
index 679cfa5..13ce759 100644
--- a/Extensions/combined/src/events.js
+++ b/Extensions/combined/src/events.js
@@ -43,7 +43,7 @@ function likeClicked() {
if (checkForSignInButton() === false) {
if (storedData.previousState === DISLIKED_STATE) {
sendVote(1);
- storedData.dislikes--;
+ if (storedData.dislikes > 0) storedData.dislikes--;
storedData.likes++;
createRateBar(storedData.likes, storedData.dislikes);
setDislikes(numberFormat(storedData.dislikes));
@@ -55,7 +55,7 @@ function likeClicked() {
storedData.previousState = LIKED_STATE;
} else if ((storedData.previousState = LIKED_STATE)) {
sendVote(0);
- storedData.likes--;
+ if (storedData.likes > 0) storedData.likes--;
createRateBar(storedData.likes, storedData.dislikes);
storedData.previousState = NEUTRAL_STATE;
}
@@ -72,13 +72,13 @@ function dislikeClicked() {
storedData.previousState = DISLIKED_STATE;
} else if (storedData.previousState === DISLIKED_STATE) {
sendVote(0);
- storedData.dislikes--;
+ if (storedData.dislikes > 0) storedData.dislikes--;
setDislikes(numberFormat(storedData.dislikes));
createRateBar(storedData.likes, storedData.dislikes);
storedData.previousState = NEUTRAL_STATE;
} else if (storedData.previousState === LIKED_STATE) {
sendVote(-1);
- storedData.likes--;
+ if (storedData.likes > 0) storedData.likes--;
storedData.dislikes++;
setDislikes(numberFormat(storedData.dislikes));
createRateBar(storedData.likes, storedData.dislikes);
@@ -113,4 +113,4 @@ export {
dislikeClicked,
addLikeDislikeEventListener,
storageChangeHandler,
-}; \ No newline at end of file
+};
diff --git a/README.md b/README.md
index ed35ee6..4e5acad 100644
--- a/README.md
+++ b/README.md
@@ -25,8 +25,7 @@ Additionally, the `dislike` field in the YouTube API was [removed](https://suppo
## What it Does
-With the removal of dislike stats from the YouTube API, our backend switched to using a combination of scraped dislike stats, estimates extrapolated from extension user data
-and estimates based on view\like ratios.
+With the removal of dislike stats from the YouTube API, our backend switched to using a combination of scraped dislike stats, estimates extrapolated from extension user data.
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/FAQ.md)
@@ -34,6 +33,7 @@ and estimates based on view\like ratios.
You can learn more at our website at: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+
## API documentation
Third party use of this open API is allowed with the following restrictions:
@@ -66,11 +66,14 @@ Example to get votes of a given YouTube video ID:
None existing YouTube ID will return status code *404* "Not Found".
Wrong formed YouTube ID will return *400* "Bad Request".
-## HELP WANTED
-We have an issue which is happening to a low percentage of Chrome users. service worker (ex background script) goes to Inactive state and doesn't wake up even when youtube tab is reopened. Only switching the extension off and on in extensions tab helps. This looks like a Chrome manifestv3 bug - so if anyone knows a good workaround - please open an issue\create a PR.
-Looks like its [this bug in chromium](https://bugs.chromium.org/p/chromium/issues/detail?id=1271154), and there is no good workaround. If anyone is aware of a workaounds - please contact.
+<!---
+## API documentation
+
+You can view all documentation on our website.
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
## Contributing
diff --git a/Website/layouts/default.vue b/Website/layouts/default.vue
index bde338f..f88d83f 100644
--- a/Website/layouts/default.vue
+++ b/Website/layouts/default.vue
@@ -31,30 +31,13 @@
export default {
data: () => ({
links: [
- {
- name: "Home",
- path: "/",
- },
- {
- name: "Install",
- path: "/install",
- },
- {
- name: "Help",
- path: "/help",
- },
- {
- name: "FAQ",
- path: "/faq",
- },
- {
- name: "Donate",
- path: "/donate",
- },
- {
- name: "Links",
- path: "/links",
- },
+ { name: "Home", path: "/" },
+ { name: "Install", path: "/install" },
+ { name: "Help", path: "/help" },
+ { name: "FAQ", path: "/faq" },
+ { name: "Donate", path: "/donate" },
+ { name: "Links", path: "/links" },
+ { name: "API", path: "/documentation" },
],
}),
};
diff --git a/Website/nuxt.config.js b/Website/nuxt.config.js
index 9860f32..165bff8 100644
--- a/Website/nuxt.config.js
+++ b/Website/nuxt.config.js
@@ -27,12 +27,18 @@ export default {
],
},
+ env: {
+ apiUrl: "https://returnyoutubedislikeapi.com",
+ },
+
+ //server: { host: '0.0.0.0', port: 80 }, //LINE FOR DEBUGGING ONLY
+
target: "static",
css: [],
plugins: [],
components: true,
buildModules: ["@nuxtjs/vuetify"],
- modules: [],
+ modules: ["nuxt-user-agent"],
// Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify
vuetify: {
@@ -52,7 +58,7 @@ export default {
},
},
},
-
+ /*
build: {
extend(config, ctx) {
// Run ESLint on save (dev-only)
@@ -65,5 +71,6 @@ export default {
});
}
},
- },
+ }
+*/
};
diff --git a/Website/package-lock.json b/Website/package-lock.json
index a9adf2f..3dca403 100644
--- a/Website/package-lock.json
+++ b/Website/package-lock.json
@@ -10,9 +10,11 @@
"dependencies": {
"core-js": "^3.15.1",
"nuxt": "^2.15.7",
+ "nuxt-user-agent": "^1.2.2",
"vuetify": "^2.5.5"
},
"devDependencies": {
+ "@nuxtjs/device": "^2.1.0",
"@nuxtjs/vuetify": "^1.12.1",
"babel-eslint": "^10.1.0",
"eslint": "^7.32.0",
@@ -2643,6 +2645,21 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
+ "node_modules/@nuxtjs/device": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/device/-/device-2.1.0.tgz",
+ "integrity": "sha512-TYBdt1w2bmCCWp+MhgcBATZtqyUBi3nSdNpcLGILw5USLwCsC/yZtIkq9YisuEzuRnod9w/RZpoE80MxLftEuA==",
+ "dev": true,
+ "dependencies": {
+ "defu": "^3.2.2"
+ }
+ },
+ "node_modules/@nuxtjs/device/node_modules/defu": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-3.2.2.tgz",
+ "integrity": "sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==",
+ "dev": true
+ },
"node_modules/@nuxtjs/vuetify": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@nuxtjs/vuetify/-/vuetify-1.12.1.tgz",
@@ -8914,6 +8931,14 @@
"nuxt": "bin/nuxt.js"
}
},
+ "node_modules/nuxt-user-agent": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/nuxt-user-agent/-/nuxt-user-agent-1.2.2.tgz",
+ "integrity": "sha512-Z9d+r1/PzJAvrr4rX70IWvRyI3qw3RukAGrRZPZ9WeByuCWmVKiW8G1AhdkUOyrDrVoBUC59iLqIVkop/NjSuQ==",
+ "dependencies": {
+ "woothee": "^1.8.1"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -14548,6 +14573,11 @@
"node": ">=8"
}
},
+ "node_modules/woothee": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/woothee/-/woothee-1.11.1.tgz",
+ "integrity": "sha512-KdArM3MsNa5tlSBSL29w9ouy9MXZoFPeUdPVnL4QZH3iyV8HsqnwbWw2YLiXEx2wAh0bM55dnl0+qDE6KHBlhQ=="
+ },
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -16628,6 +16658,23 @@
}
}
},
+ "@nuxtjs/device": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/device/-/device-2.1.0.tgz",
+ "integrity": "sha512-TYBdt1w2bmCCWp+MhgcBATZtqyUBi3nSdNpcLGILw5USLwCsC/yZtIkq9YisuEzuRnod9w/RZpoE80MxLftEuA==",
+ "dev": true,
+ "requires": {
+ "defu": "^3.2.2"
+ },
+ "dependencies": {
+ "defu": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-3.2.2.tgz",
+ "integrity": "sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==",
+ "dev": true
+ }
+ }
+ },
"@nuxtjs/vuetify": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@nuxtjs/vuetify/-/vuetify-1.12.1.tgz",
@@ -21504,6 +21551,14 @@
"@nuxt/webpack": "2.15.8"
}
},
+ "nuxt-user-agent": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/nuxt-user-agent/-/nuxt-user-agent-1.2.2.tgz",
+ "integrity": "sha512-Z9d+r1/PzJAvrr4rX70IWvRyI3qw3RukAGrRZPZ9WeByuCWmVKiW8G1AhdkUOyrDrVoBUC59iLqIVkop/NjSuQ==",
+ "requires": {
+ "woothee": "^1.8.1"
+ }
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -25917,6 +25972,11 @@
"string-width": "^4.0.0"
}
},
+ "woothee": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/woothee/-/woothee-1.11.1.tgz",
+ "integrity": "sha512-KdArM3MsNa5tlSBSL29w9ouy9MXZoFPeUdPVnL4QZH3iyV8HsqnwbWw2YLiXEx2wAh0bM55dnl0+qDE6KHBlhQ=="
+ },
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
diff --git a/Website/package.json b/Website/package.json
index c16dbf1..03b6ce9 100644
--- a/Website/package.json
+++ b/Website/package.json
@@ -12,6 +12,7 @@
"dependencies": {
"core-js": "^3.15.1",
"nuxt": "^2.15.7",
+ "nuxt-user-agent": "^1.2.2",
"vuetify": "^2.5.5"
},
"devDependencies": {
diff --git a/Website/pages/debug.vue b/Website/pages/debug.vue
new file mode 100644
index 0000000..fbdfc50
--- /dev/null
+++ b/Website/pages/debug.vue
@@ -0,0 +1,68 @@
+<template>
+ <div>
+ <!-- Top Section // "Sections" Card -->
+ <v-card max-width="600px" class="rounded-lg">
+ <v-card-title style="padding-bottom: 0">Debug Information</v-card-title>
+ <v-card-text style="text-align: left">
+ <!-- Gather Browser Information -->
+ <span><b>Browser Information:</b></span
+ ><br />
+ <span>Browser: {{ device._parsed.name }}</span
+ ><br />
+ <span>Browser Vendor: {{ device._parsed.vendor }}</span
+ ><br />
+ <span>Version: {{ device._parsed.version }}</span
+ ><br />
+ <span>Operating System: {{ device._parsed.os }}</span
+ ><br />
+ <span>Operating System Version: {{ device._parsed.os_version }}</span
+ ><br />
+ <span>Device Type: {{ device._parsed.category }}</span
+ ><br /><br />
+ <!-- Gather Extension Information -->
+ <span><b>Installed Extension Information:</b></span
+ ><br />
+ <span
+ >Extension Version:
+ <span id="extension-version">Waiting For Extension...</span></span
+ ><br />
+ </v-card-text>
+ <v-card-actions>
+ <v-spacer />
+ <v-btn @click="copy()">
+ <v-icon small style="margin-right: 0.25em">mdi-content-copy</v-icon
+ >Copy
+ </v-btn>
+ </v-card-actions>
+ </v-card>
+ </div>
+</template>
+
+<script>
+export default {
+ data() {
+ return {
+ device: this.$ua,
+ };
+ },
+
+ methods: {
+ copy() {
+ const toCopy = `\`\`\`
+Browser Information:
+Browser: ${this.device._parsed.name}
+Browser Vendor: ${this.device._parsed.vendor}
+Version: ${this.device._parsed.version}
+Operating System: ${this.device._parsed.os}
+Operating System Version: ${this.device._parsed.os_version}
+Device Type: ${this.device._parsed.category}
+
+Installed Extension Information:
+Extension Version: ${document.getElementById("extension-version").innerHTML}
+\`\`\``;
+
+ navigator.clipboard.writeText(toCopy);
+ },
+ },
+};
+</script>
diff --git a/Website/pages/documentation.vue b/Website/pages/documentation.vue
new file mode 100644
index 0000000..ff21a68
--- /dev/null
+++ b/Website/pages/documentation.vue
@@ -0,0 +1,60 @@
+<template>
+ <div>
+ <!-- Top Section // "Sections" Card -->
+ <v-card max-width="600px" class="rounded-lg">
+ <v-card-title style="padding-bottom: 0">Sections</v-card-title>
+ <v-list>
+ <!-- Dynamically Generate Links From Below -->
+ <v-list-item v-for="(item, i) in links" :key="i" router :to="item.to">
+ <v-list-item-icon>
+ <v-icon v-text="item.icon" />
+ </v-list-item-icon>
+ <v-list-item-title style="text-align: left">
+ <v-list-item-title v-text="item.text" />
+ </v-list-item-title>
+ </v-list-item>
+ </v-list>
+ </v-card>
+
+ <!-- Child Pages // Card -->
+ <v-card
+ max-width="600px"
+ class="rounded-lg"
+ style="margin: 1em; padding: 0.75em; text-align: left"
+ >
+ <NuxtChild />
+ </v-card>
+ </div>
+</template>
+
+<script>
+export default {
+ data() {
+ return {
+ //--- Links To Generate Above ---//
+ links: [
+ {
+ text: "Usage Rights",
+ icon: "mdi-book-open-variant",
+ to: "/documentation/usage-rights",
+ },
+ {
+ text: "URL Information",
+ icon: "mdi-web",
+ to: "/documentation/url",
+ },
+ {
+ text: "Available Endpoints",
+ icon: "mdi-transit-connection-variant",
+ to: "/documentation/endpoints",
+ },
+ {
+ text: "Basic Fetching Tutorial",
+ icon: "mdi-school",
+ to: "/documentation/fetching",
+ },
+ ],
+ };
+ },
+};
+</script>
diff --git a/Website/pages/documentation/endpoints.vue b/Website/pages/documentation/endpoints.vue
new file mode 100644
index 0000000..ef94c10
--- /dev/null
+++ b/Website/pages/documentation/endpoints.vue
@@ -0,0 +1,19 @@
+<template>
+ <div>
+ <h1 class="primary--text">Available Endpoints</h1>
+ List of available endpoints is available here:<br />
+ <a :href="endpointUrl" target="_blank" v-text="endpointUrl" />
+ </div>
+</template>
+
+<script>
+let apiUrl = process.env.apiUrl;
+export default {
+ data() {
+ return {
+ apiUrl: apiUrl,
+ endpointUrl: apiUrl + "/swagger/index.html",
+ };
+ },
+};
+</script>
diff --git a/Website/pages/documentation/fetching.vue b/Website/pages/documentation/fetching.vue
new file mode 100644
index 0000000..651f2b8
--- /dev/null
+++ b/Website/pages/documentation/fetching.vue
@@ -0,0 +1,78 @@
+<template>
+ <div>
+ <h1 class="primary--text">Basic Fetching Tutorial</h1>
+
+ <span>Example to get votes of a given YouTube video ID:</span>
+ <a href="https://youtube.com/watch?v=kxOuG8jMIgI" target="_blank"
+ >kxOuG8jMIgI</a
+ ><br /><br />
+
+ <h2>Example Request:</h2>
+ <span><b>Request URL:</b></span>
+ <a
+ :href="apiUrl + '/votes?videoId=kxOuG8jMIgI'"
+ target="_blank"
+ v-text="apiUrl + '/votes?videoId=kxOuG8jMIgI'"
+ /><br />
+ <span
+ ><b>Request Method:</b>
+ <a
+ href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET"
+ target="_blank"
+ >HTTP/GET</a
+ ></span
+ ><br />
+ <span><b>Headers:</b></span
+ ><br />
+ <code class="code">
+ Accept: text/html,application/xhtml+xml,application/xml;q=0.9<br />
+ Pragma: no-cache<br />
+ Cache-Control: no-cache<br />
+ Connection: keep-alive </code
+ ><br />
+ <span><b>Response:</b></span
+ ><br />
+ <div class="code">
+ <code style="background-color: rgba(0, 0, 0, 0)">
+ {<br />
+ "id": "kxOuG8jMIgI",<br />
+ "dateCreated": "2021-12-20T12:25:54.418014Z",<br />
+ "likes": 27326,<br />
+ "dislikes": 498153,<br />
+ "rating": 1.212014408444885,<br />
+ "viewCount": 3149885,<br />
+ "deleted": false<br />
+ }
+ </code>
+ </div>
+ <br /><br />
+ <v-alert border="left" color="orange" text type="info">
+ <span>An invalid YouTube ID will return status code 404 "Not Found".</span
+ ><br />
+ <span
+ >An incorrectly formatted YouTube ID will return 400 "Bad
+ Request".</span
+ >
+ </v-alert>
+
+ <a :href="endpointUrl" target="_blank" v-text="endpointUrl" />
+ </div>
+</template>
+
+<style scoped>
+.code {
+ width: 100%;
+ background: #353535;
+ border-radius: 3px;
+}
+</style>
+
+<script>
+export default {
+ data() {
+ return {
+ apiUrl: process.env.apiUrl,
+ };
+ },
+};
+</script>
diff --git a/Website/pages/documentation/index.vue b/Website/pages/documentation/index.vue
new file mode 100644
index 0000000..ad3cd1d
--- /dev/null
+++ b/Website/pages/documentation/index.vue
@@ -0,0 +1,8 @@
+<template>
+ <div>
+ <h1>
+ Welcome to the <span class="primary--text">official RYD docs</span>!
+ </h1>
+ <p>To get started, select a section.</p>
+ </div>
+</template>
diff --git a/Website/pages/documentation/url.vue b/Website/pages/documentation/url.vue
new file mode 100644
index 0000000..e95f542
--- /dev/null
+++ b/Website/pages/documentation/url.vue
@@ -0,0 +1,17 @@
+<template>
+ <div>
+ <h1 class="primary--text">URL Information</h1>
+ The API is accessible over the following base URL:<br />
+ <a :href="apiUrl" target="_blank" v-text="apiUrl" />
+ </div>
+</template>
+
+<script>
+export default {
+ data() {
+ return {
+ apiUrl: process.env.apiUrl,
+ };
+ },
+};
+</script>
diff --git a/Website/pages/documentation/usage-rights.vue b/Website/pages/documentation/usage-rights.vue
new file mode 100644
index 0000000..09bf581
--- /dev/null
+++ b/Website/pages/documentation/usage-rights.vue
@@ -0,0 +1,30 @@
+<template>
+ <div>
+ <h1 class="primary--text">Usage Rights</h1>
+ <p>
+ Third party use of this open API is allowed with the following
+ restrictions:
+ </p>
+ <ul>
+ <li>
+ <b>Attribution:</b> This project should be clearly attributed with
+ either a link to this repo or a link to returnyoutubedislike.com.
+ </li>
+ <li>
+ <b>Rate Limiting:</b> There are per client rate limits in place of 100
+ per minute and 10'000 per day. This will return a 429 status code
+ indicating that your application should back off.
+ </li>
+ </ul>
+ </div>
+</template>
+
+<style scoped>
+li {
+ margin-top: 0.5em;
+}
+
+b {
+ font-weight: 900 !important;
+}
+</style>
diff --git a/Website/pages/index.vue b/Website/pages/index.vue
index 3a3efd3..bb44926 100644
--- a/Website/pages/index.vue
+++ b/Website/pages/index.vue
@@ -28,7 +28,7 @@
<h1 class="title-text">Return YouTube Dislike</h1>
<div class="mb-4" style="color: #999">
<p style="margin-top: 0">
- Browser extension and an API that show you dislikes on Youtube
+ Browser extension and an API that shows you dislikes on Youtube
</p>
</div>
diff --git a/Website/pages/install.vue b/Website/pages/install.vue
index b9b0032..a92b2f9 100644
--- a/Website/pages/install.vue
+++ b/Website/pages/install.vue
@@ -92,7 +92,7 @@ export default {
scriptLink:
"https://github.com/Anarios/return-youtube-dislike/raw/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js",
- iosJailbreakLink: "https://repo.lillieweeb001.xyz/",
+ iosJailbreakLink: "https://chariz.com/get/return-youtube-dislike/",
};
},
};
diff --git a/package-lock.json b/package-lock.json
index a3efdd0..eec716e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2141,6 +2141,8 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
"integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -2156,7 +2158,9 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
@@ -5570,15 +5574,14 @@
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
- "requires": {
- "ajv": "^8.0.0"
- },
+ "requires": {},
"dependencies": {
"ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
+ "version": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
"integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -5590,7 +5593,9 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
}
}
},