您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Plays review audios on meaning answers as long as the reading has been got correctly beforehand
当前为
// ==UserScript== // @name Audio Tweak 4.0 // @namespace http://tampermonkey.net/ // @version 0.3 // @description Plays review audios on meaning answers as long as the reading has been got correctly beforehand // @author Hubbit200 // @match https://www.wanikani.com/subjects/review // @icon https://www.google.com/s2/favicons?sz=64&domain=wanikani.com // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // Initialize an empty array to store the words and their information var wordList = []; var hasPlayedAlready = false; var queueElement = document.body.querySelector(`[id="quiz-queue"]`).firstElementChild; // Listen for the Turbo event "didAnswerQuestion" function handleDidAnswerQuestion() { // Get the word from the div with class "character-header__characters" let word = document.querySelector(".character-header__characters").textContent; // Get the question type from the span with class "quiz-input__question-type" let questionType = document.querySelector(".quiz-input__question-type").textContent; // Get item type let itemType = document.querySelector(".quiz-input__question-category").textContent; // Check if the word is already in the list let index = wordList.findIndex(function(item) { return item.word === word; }); // If the word is not in the list if (index === -1 && itemType == "Vocabulary") { // Create a new object with the word, audio link and isReadingComplete properties let newItem = { word: word, audioLink: null, isReadingComplete: false }; // Add the new item to the list wordList.push(newItem); } // If the word is already in the list else if (index !== -1) { if(hasPlayedAlready) return; // Get the existing item from the list let existingItem = wordList[index]; // If isReadingComplete is true if (existingItem.isReadingComplete) { // Play the audio link if(existingItem.audioLink == null) return; let audio = new Audio(existingItem.audioLink); if(audio == null) console.log("Invalid Audio"); else { audio.play(); hasPlayedAlready = true; let audioButton = document.querySelector('[data-action="quiz-audio#play"]'); let audioIcon = audioButton.querySelector('i'); audioButton.onclick = function() { if(audio.paused) { audio.play(); audioIcon.classList.remove("fa-volume-off"); audioIcon.classList.add("fa-volume-high"); audioButton.classList.remove("additional-content__item--disabled");} } audio.onended = function() { audioIcon.classList.remove("fa-volume-high"); audioIcon.classList.add("fa-volume-off"); } setTimeout(function() { audioButton.classList.remove("additional-content__item--disabled"); }, 100); } } } } // Listen for the Turbo event "didCompleteSubject" function handleDidCompleteSubject() { // Get the word from the div with class "character-header__characters" let word = document.querySelector(".character-header__characters").textContent; // Check if the word is in the list let index = wordList.findIndex(function(item) { return item.word === word; }); // If the word is in the list if (index !== -1) { // Remove it from the list wordList.splice(index, 1); } } function handleWillShowNextQuestion() { hasPlayedAlready = false; // Get the question type from the span with class "quiz-input__question-type" let questionType = document.querySelector(".quiz-input__question-type").textContent; // Get item type let itemType = document.querySelector(".quiz-input__question-category").textContent; // Check if previous item was correct let wasPrevCorrect = document.querySelector(".quiz-input__input-container[correct='true']"); let audioButton = document.querySelector('[data-action="quiz-audio#play"]'); if (audioButton.onclick != null) audioButton.onclick = null; if (questionType.includes("reading") && itemType.includes("Vocabulary") && wasPrevCorrect != undefined) { // Get the word from the div with class "character-header__characters" let word = document.querySelector(".character-header__characters").textContent; // Check if the word is already in the list let listItem = wordList[wordList.findIndex(function(item) { return item.word === word; })]; // If listItem is null, break if (listItem == null) return; // Get the audio link from the queue let audioObj = JSON.parse(queueElement.textContent).find(obj => { return obj.type == "Vocabulary" && obj.characters == word; }); // Set the audio link and isReadingComplete to true listItem.audioLink = audioObj.readings[0].pronunciations[0].sources[0].url; listItem.isReadingComplete = true; } } // Add event listeners for both events using addEventListener window.addEventListener("didAnswerQuestion", handleDidAnswerQuestion); window.addEventListener("didCompleteSubject", handleDidCompleteSubject); window.addEventListener("willShowNextQuestion", handleWillShowNextQuestion); })();