您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Korrigiert Bildpfade in Kommentaren, Antworten und Zusatzinfos bei Klick auf das fehlende Bild
// ==UserScript== // @name MyDealz Grafikpfad im Kommentar fixen // @namespace http://tampermonkey.net/ // @version 1.3 // @description Korrigiert Bildpfade in Kommentaren, Antworten und Zusatzinfos bei Klick auf das fehlende Bild // @author MD928835 // @license MIT // @match https://www.mydealz.de/* // @grant none // ==/UserScript== (function() { 'use strict'; const commentListItemSelector = 'li.commentList-item'; const commentArticleSelector = 'article.comment'; const commentBodySelector = '.comment-body .userHtml-content'; const replyItemSelector = '.comment-replies-item'; const additionalInfoSelector = '.thread-infos'; const additionalInfoContentSelector = '.userHtml-content'; function fixClickedImage(img) { const originalSrc = img.getAttribute('src'); const dataImageId = img.dataset.image; if (!originalSrc || !dataImageId) return; // Prüfen, ob es sich um ein Kommentar/Antwort-Bild oder Zusatzinfo-Bild handelt const isCommentImage = originalSrc.includes('static.mydealz.de/comments/'); const isAdditionalInfoImage = originalSrc.includes('static.mydealz.de/thread_additional_info/'); if ((!isCommentImage && !isAdditionalInfoImage) || originalSrc.split('/').pop().includes('_')) { return; } const srcMatch = originalSrc.match(/\/(\d+)(\.[^.\/]+)$/); if (!srcMatch || srcMatch[1] !== dataImageId) { return; } if (isCommentImage) { fixCommentImage(img, originalSrc, dataImageId); } else if (isAdditionalInfoImage) { fixAdditionalInfoImage(img, originalSrc, dataImageId); } } function fixCommentImage(img, originalSrc, dataImageId) { const commentArticle = img.closest(commentArticleSelector); if (!commentArticle) return; // Prüfen ob wir in einer Antwort sind const replyItem = commentArticle.closest(replyItemSelector); const isReply = replyItem !== null; let commentId; if (isReply) { // Bei Antworten: ID direkt aus dem data-id Attribut oder aus dem id-Attribut ohne "reply-" Präfix if (replyItem.hasAttribute('data-id')) { commentId = replyItem.getAttribute('data-id'); } else if (replyItem.id && replyItem.id.startsWith('reply-')) { commentId = replyItem.id.replace('reply-', ''); } else { return; // Keine ID gefunden, Abbruch } } else { // Für Hauptkommentare: bisherige Logik const commentLi = commentArticle.closest(commentListItemSelector); if (!commentLi || !commentLi.id || !commentLi.id.startsWith('comment-')) return; commentId = commentLi.id.replace('comment-', ''); } const commentBody = commentArticle.querySelector(commentBodySelector); if (!commentBody) return; applyImageCorrection(img, originalSrc, commentBody, commentId); } function fixAdditionalInfoImage(img, originalSrc, dataImageId) { // Zusatzinfo-Container finden const additionalInfo = img.closest(additionalInfoSelector); if (!additionalInfo) return; // ID der Zusatzinfo ermitteln let infoId; // Versuche ID von Anker zu finden const anchorTarget = additionalInfo.querySelector('.anchorTarget'); if (anchorTarget && anchorTarget.id && anchorTarget.id.startsWith('additional-info-')) { infoId = anchorTarget.id.replace('additional-info-', ''); } else if (additionalInfo.id && additionalInfo.id.startsWith('additional-info-')) { infoId = additionalInfo.id.replace('additional-info-', ''); } else if (window.location.hash && window.location.hash.startsWith('#additional-info-')) { // Alternativ aus Hash-Fragment extrahieren infoId = window.location.hash.replace('#additional-info-', ''); } else { // Fallback: nach einem eindeutigen ID-Attribut mit additional-info suchen const infoElements = document.querySelectorAll('[id^="additional-info-"]'); if (infoElements.length > 0) { infoId = infoElements[0].id.replace('additional-info-', ''); } else { // Notfall-Fallback: zufällige ID infoId = 'info-' + Math.floor(Math.random() * 100000); } } const infoContent = additionalInfo.querySelector(additionalInfoContentSelector); if (!infoContent) return; applyImageCorrection(img, originalSrc, infoContent, infoId); } function applyImageCorrection(img, originalSrc, container, id) { const imagesInContainer = Array.from(container.querySelectorAll('img[data-image]')); let imgIndex = 0; let currentIdx = 0; for (const siblingImg of imagesInContainer) { const siblingSrc = siblingImg.getAttribute('src'); const siblingDataImageId = siblingImg.dataset.image; const siblingFileName = siblingSrc?.split('/').pop(); const siblingSrcMatch = siblingSrc?.match(/\/(\d+)(\.[^.\/]+)$/); if (siblingSrc && siblingDataImageId && !siblingFileName.includes('_') && siblingSrcMatch && siblingSrcMatch[1] === siblingDataImageId) { currentIdx++; if (siblingImg === img) { imgIndex = currentIdx; break; } } } if (imgIndex === 0) imgIndex = 1; const newName = `${id}_${imgIndex}`; let newSrc = originalSrc.replace(/\/(\d+)\/fs\//, `/${newName}/fs/`); newSrc = newSrc.replace(/\/(\d+)(\.[^.\/]+)$/, `/${newName}$2`); if (newSrc !== originalSrc) { img.setAttribute('src', newSrc); if (img.dataset.src === originalSrc) img.dataset.src = newSrc; if (img.srcset && img.srcset.includes(originalSrc)) { const oldSrcEscaped = originalSrc.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); img.srcset = img.srcset.replace(new RegExp(oldSrcEscaped, 'g'), newSrc); } img.removeEventListener('click', handleClick); } } function handleClick(event) { if (event.target.tagName === 'IMG') { const img = event.target; const src = img.getAttribute('src'); if (src && (src.includes('static.mydealz.de/comments/') || src.includes('static.mydealz.de/thread_additional_info/')) && img.dataset.image && !src.split('/').pop().includes('_')) { if (img.naturalWidth === 0) { fixClickedImage(img); } } } } document.body.addEventListener('click', handleClick); })();