fix(harvest): Download is a submenu parent — hover to unfurl 1K flyout, don't click; looser menu finder; reset seen-list (v2 key)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
d3281bc251
commit
2dfa752df3
28
content.js
28
content.js
@ -541,8 +541,14 @@ function findTileMenuButton(tile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function findMenuItem(re) {
|
function findMenuItem(re) {
|
||||||
return [...document.querySelectorAll('[role="menu"] [role="menuitem"], [role="menuitem"], [role="menu"] button, [role="dialog"] button')]
|
const roled = [...document.querySelectorAll('[role="menu"] [role="menuitem"], [role="menuitem"], [role="menu"] button, [role="dialog"] button')]
|
||||||
.filter(visible).find(e => re.test((e.textContent || '').trim()));
|
.filter(visible).find(e => re.test((e.textContent || '').trim()));
|
||||||
|
if (roled) return roled;
|
||||||
|
// fallback for menus without ARIA roles: small visible leaf nodes with matching text
|
||||||
|
const leaf = [...document.querySelectorAll('div, span, li, button')].filter(visible)
|
||||||
|
.filter(e => re.test((e.textContent || '').trim()) && (e.textContent || '').trim().length < 30 &&
|
||||||
|
!e.querySelector('div, span, li, button'));
|
||||||
|
return leaf.length ? (leaf[0].closest('[role="menuitem"], li, button') || leaf[0]) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function executeHarvest(task) {
|
async function executeHarvest(task) {
|
||||||
@ -550,7 +556,7 @@ async function executeHarvest(task) {
|
|||||||
let got = 0, missed = 0, skipped = 0;
|
let got = 0, missed = 0, skipped = 0;
|
||||||
try {
|
try {
|
||||||
await waitForAgentReady(30000);
|
await waitForAgentReady(30000);
|
||||||
const stored = await new Promise(r => chrome.storage.local.get({ harvested_urls: [] }, d => r(d.harvested_urls)));
|
const stored = await new Promise(r => chrome.storage.local.get({ harvested_urls_v2: [] }, d => r(d.harvested_urls_v2)));
|
||||||
const seen = new Set(stored);
|
const seen = new Set(stored);
|
||||||
await bg({ type: 'harvestRouting', on: true });
|
await bg({ type: 'harvestRouting', on: true });
|
||||||
window.scrollTo(0, 0); await sleep(800);
|
window.scrollTo(0, 0); await sleep(800);
|
||||||
@ -568,14 +574,20 @@ async function executeHarvest(task) {
|
|||||||
const dots = findTileMenuButton(tile);
|
const dots = findTileMenuButton(tile);
|
||||||
if (!dots) { missed++; seen.add(href); log('info', `harvest: no ⋮ on a tile — ${gridCensus()}`); continue; }
|
if (!dots) { missed++; seen.add(href); log('info', `harvest: no ⋮ on a tile — ${gridCensus()}`); continue; }
|
||||||
await bg({ type: 'clickAt', ...center(dots) }); await sleep(800);
|
await bg({ type: 'clickAt', ...center(dots) }); await sleep(800);
|
||||||
const dl = findMenuItem(/^\s*download\s*$/i);
|
const dl = findMenuItem(/^\s*download\b/i);
|
||||||
if (!dl) { missed++; seen.add(href); await bg({ type: 'pressEscape' }); await sleep(400); continue; }
|
if (!dl) { missed++; seen.add(href); log('info', `harvest: menu open but no Download item — ${gridCensus()}`); await bg({ type: 'pressEscape' }); await sleep(400); continue; }
|
||||||
await bg({ type: 'clickAt', ...center(dl) }); await sleep(800);
|
// "Download" is a submenu parent: HOVER unfurls the nested 1K/2K/4K flyout
|
||||||
const oneK = findMenuItem(/1k|original/i);
|
// (clicking it closes the menu — the bug the first pass hit).
|
||||||
if (!oneK) { missed++; seen.add(href); await bg({ type: 'pressEscape' }); await sleep(400); continue; }
|
await bg({ type: 'hoverAt', ...center(dl) }); await sleep(800);
|
||||||
|
let oneK = findMenuItem(/\b1k\b|original/i);
|
||||||
|
if (!oneK) { // some builds expand on click instead — try once
|
||||||
|
await bg({ type: 'clickAt', ...center(dl) }); await sleep(800);
|
||||||
|
oneK = findMenuItem(/\b1k\b|original/i);
|
||||||
|
}
|
||||||
|
if (!oneK) { missed++; seen.add(href); log('info', 'harvest: Download hovered but no 1K flyout appeared.'); await bg({ type: 'pressEscape' }); await sleep(400); continue; }
|
||||||
await bg({ type: 'clickAt', ...center(oneK) });
|
await bg({ type: 'clickAt', ...center(oneK) });
|
||||||
got++; seen.add(href);
|
got++; seen.add(href);
|
||||||
chrome.storage.local.set({ harvested_urls: [...seen].slice(-3000) });
|
chrome.storage.local.set({ harvested_urls_v2: [...seen].slice(-3000) });
|
||||||
if (got % 10 === 0) log('info', `harvest: ${got} downloaded so far…`);
|
if (got % 10 === 0) log('info', `harvest: ${got} downloaded so far…`);
|
||||||
await sleep(1800 + Math.random() * 1500); // pace — don't machine-gun the account
|
await sleep(1800 + Math.random() * 1500); // pace — don't machine-gun the account
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user