Greasy Fork is available in English.

ero_digger

特定タグを含む動画を目立たせる

// ==UserScript==
// @name         ero_digger
// @namespace    @tanbatsu
// @version      2023-12-28-1
// @description  特定タグを含む動画を目立たせる
// @author       You
// @match        https://www.nicovideo.jp/newarrival*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=nicovideo.jp
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    let settings = ["連れオナ動画","セクハラ動画","ずんだもん","エンターテイメント"]
    //ここでタグを設定(アルファベットは大文字でも小文字でも良いです)



    var ncLinkElements = document.querySelectorAll('.NC-VideoCard_defaultMeta');
    async function fetchDataAndExtractJson(url) {
        try {
            // fetchで指定のURLからHTMLを取得
            const response = await fetch(url);

            // レスポンスが成功したか確認
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }

            // レスポンスのテキストを取得
            const htmlText = await response.text();

            // テキストからDOMを生成
            const parser = new DOMParser();
            const doc = parser.parseFromString(htmlText, 'text/html');

            // #js-initial-watch-data要素を取得
            const initialWatchDataElement = doc.getElementById('js-initial-watch-data');

            // #js-initial-watch-dataが見つからなかった場合の処理
            if (!initialWatchDataElement) {
                throw new Error('#js-initial-watch-data not found in the HTML');
            }

            // data-api-data属性の値を取得
            const dataApiDataValue = initialWatchDataElement.getAttribute('data-api-data');

            // data-api-data属性が見つからなかった場合の処理
            if (!dataApiDataValue) {
                throw new Error('data-api-data attribute not found in #js-initial-watch-data');
            }

            // data-api-data属性の値をJSONに変換
            const jsonData = JSON.parse(dataApiDataValue);

            // JSONを返す
            return jsonData;
        } catch (error) {
            console.error('Error:', error.message);
            // エラーが発生した場合、適切に処理するか、エラーメッセージを返すなどの対応を行う
            return null;
        }
    }

    // 関数を呼び出してデータを取得

    // 各.NC-Link要素に対して処理
    ncLinkElements.forEach(function(ncLinkElement) {
        const videoId = ncLinkElement.getAttribute("data-video-id")
        // .NC-Card-media要素を取得
        fetchDataAndExtractJson('https://www.nicovideo.jp/watch/' + videoId)
            .then(jsonData => {
            if (jsonData) {
                const tags = jsonData.tag.items;
                console.log(jsonData.genre.label)
                tags.forEach(function(tags){
                    let Element = ncLinkElement.childNodes[0].childNodes[2]
                    if(settings.includes(tags.name.toLowerCase() )){
                        ncLinkElement.style.backgroundColor = "#ffe0cf"
                        Element.insertAdjacentHTML("beforeend","<big style='color:blue'>" +tags.name +",<big>")
                    }else{
                        Element.insertAdjacentHTML("beforeend","<small style='color:gray'>" + tags.name +",<small>")
                    }

                })
                if(settings.includes(jsonData.genre.label.toLowerCase())){
                    ncLinkElement.style.backgroundColor = "#ffe0cf"
                     Element.insertAdjacentHTML("beforeend","<big style='color:blue'>" +jsonData.genre.label +",<big>")
                }
            }
        });

    });

})();