您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
open folder or play media file in stash
// ==UserScript== // @name stash_open_file // @version 20250208 // @description open folder or play media file in stash // @description:en open folder or play media file in stash // @author lefty // @grant GM.xmlHttpRequest // @license MIT // @match https://192.168.*/scenes/* // @namespace https://greasyfork.org/users/1337256 // ==/UserScript== 'use strict'; function checkAndAddElement() { let a = document.querySelectorAll('dl.container.scene-file-info.details-list ')[1]; let div = a.querySelector('a[target=_blank] div.TruncatedText'); let dd = div.parentNode; let path = div.textContent; // let infoTable = document.querySelector('div.propertiesTabContent'); let openButton = document.querySelector('button#openButton'); if (div && !openButton) { dd.insertAdjacentHTML('beforeBegin', `<button id="openButton">Open folder</button> <span> </span> <button id="playButton">Play in mpv</button> <span> </span> <button id="jumpButton">Jump to folder</button>`); openButton = a.querySelector('button#openButton'); let playButton = a.querySelector('button#playButton'); let jumpButton = a.querySelector('button#jumpButton'); openButton.addEventListener("click", openFolderFn); playButton.addEventListener("click", playMediaFile); jumpButton.addEventListener("click", jumpToPath); } } function openFolderFn() { sendPathAndOperate('openFolder') } function playMediaFile() { sendPathAndOperate('playMediaFile') } function jumpToPath() { let a = document.querySelectorAll('dl.container.scene-file-info.details-list ')[1]; let div = a.querySelector('a[target=_blank] div.TruncatedText'); let path = div.textContent.replace(/^file:\/\//, ''); path = path.substring(0, path.lastIndexOf('/')); let encodedPath ="\"\\\"" + encodeURIComponent(path) + "\\\"\""; let url = `${window.location.origin}/scenes?c=("type":"path","value":${encodedPath},"modifier":"INCLUDES")&sortby=date`; // let url = window.location.origin + '/scenes?c=("type":"path","value":"%5C"' + path + '%5C"","modifier":"INCLUDES")&sortby=date'; window.open(url, '_blank'); } async function sendPathAndOperate(operate) { let data = getPath(); sendDataToLocalServer(data, operate) } function getPath() { let a = document.querySelectorAll('dl.container.scene-file-info.details-list ')[1]; let div = a.querySelector('a[target=_blank] div.TruncatedText'); let path = div.textContent.replace(/^file:\/\//, ''); let info = [{"save_path": path.substring(0, path.lastIndexOf('/'))}]; let file = [{"name":path.split('/').pop(), "size": "1"}] var result = {"file":file, "info": info, "full_path": path, "href": window.location.href,"name": path.split('/').pop()}; return result } function sendDataToLocalServer(data, path) { let url = `http://127.0.0.1:58000/${path}/` GM.xmlHttpRequest({ method: "POST", url: url, data: JSON.stringify(data), headers: { "Content-Type": "application/json" } }); } setInterval(() => { checkAndAddElement(); }, 2000);