// ==UserScript==
// @name Auto Resume Downloads (Um por vez - PT/EN)
// @namespace http://tampermonkey.net/
// @version 1.2
// @description Retoma automaticamente downloads com erro (português
ou inglês), um por vez, até completar
// @match chrome://downloads/
// @grant none
// ==/UserScript==
(function() {
'use strict';
let isProcessing = false;
const errorKeywords = [
'erro', 'interrompido', 'falha', // Português
'error', 'failed', 'interrupted' // Inglês
];
function hasError(text) {
const lower = text.toLowerCase();
return errorKeywords.some(keyword => lower.includes(keyword));
function resumeNextDownload() {
if (isProcessing) return;
const manager = document.querySelector('downloads-manager');
if (!manager) return;
[16/08, 22:54] ChatGPT: const items =
manager.shadowRoot.querySelectorAll('downloads-item');
for (const item of items) {
const root = item.shadowRoot;
const stateEl = root?.querySelector('#tag');
const stateText = stateEl?.textContent?.trim();
if (stateText && hasError(stateText)) {
isProcessing = true;
const moreBtn = root.querySelector('#moreActions');
if (moreBtn) {
moreBtn.click();
setTimeout(() => {
const menu = root.querySelector('cr-action-menu');
const menuShadow = menu?.shadowRoot;
const resumeBtn = menuShadow?.querySelector('#pause-
or-resume');
if (resumeBtn) {
resumeBtn.click();
setTimeout(() => {
isProcessing = false;
}, 10000); // Aguarda 10s antes de processar o próximo
}, 300);
}
break; // Processa um download por vez
setInterval(resumeNextDownload, 5000); // Verifica a cada 5 segundos
})();
```