You can read and reply to posts and download all mods without registering.
We're an independent and non-profit fan-site. Find out more about us here.
<script> const checkLinks = operation => { const youtubeLinks = Array.from(document.querySelectorAll('li > a[href*=youtu]')) for (const link of youtubeLinks) { const url = link.getAttribute('href') fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(url)}`) .then(async response => { const payload = await response.text() if (!response.ok) { if (response.status === 401) return // Video is available. Embedding not allowed. if (response.status === 404) { if (operation === 'mark') link.parentElement.style.backgroundColor = '#8B0000' else if (operation === 'remove') link.parentElement.remove() } else if (response.status === 403) { if (operation === 'mark') link.parentElement.style.backgroundColor = '#CC5500' else if (operation === 'remove') link.parentElement.remove() } else if (response.status === 400) { console.info(`${response.status}:${response.statusText} ${url}`) link.parentElement.style.backgroundColor = '#D4AF37' } else { console.warn(`${response.status}:${response.statusText} ${url}`) } } }) } } const createButtons = () => { const buttonContainer = document.createElement('div') document.body.prepend(buttonContainer) const markButton = document.createElement('button') markButton.textContent = 'Mark' markButton.addEventListener('click', () => checkLinks('mark')) const removeButton = document.createElement('button') removeButton.textContent = 'Remove' removeButton.addEventListener('click', () => checkLinks('remove')) buttonContainer.append(markButton, removeButton) } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', createButtons) else createButtons() </script>