Last active
May 24, 2024 19:13
-
-
Save STRML/bc6f400033207f503dce16ffedf06ea9 to your computer and use it in GitHub Desktop.
A simple script for downloading all images for a listing on BringATrailer.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
async function ensureCarouselVisible() { | |
const imgWrap = document.elementFromPoint(100, 100); | |
if (!imgWrap.classList.contains('pswp__item')) { | |
// carousel isn't active, make it so | |
document.querySelector('.gallery img').click(); | |
while (!document.elementFromPoint(100, 100).classList.contains('pswp__item')) { | |
await delay(50); | |
} | |
} | |
} | |
function delay(ms) { | |
return new Promise((resolve) => setTimeout(resolve, ms)); | |
} | |
// Find the active image, surround it in an anchor tag, then click it. | |
async function downloadImage() { | |
const imgWrap = document.elementFromPoint(100, 100); | |
const img = imgWrap.querySelector('.pswp__img'); | |
if (!img || !img.src) { | |
throw new Error("All images downloaded or next image not found."); | |
} | |
// Full image hasn't loaded yet, so change the src | |
const src = img.src | |
.split('?')[0] // get rid of querystring | |
.replace('-scaled', ''); // Remove `-scaled` to attempt to get the full res image | |
return downloadSrc(src); | |
} | |
// Create an anchor then download from it | |
function downloadSrc(src) { | |
const a = document.createElement('a'); | |
a.href = src; | |
a.download = ""; | |
a.click(); | |
} | |
function nextImage() { | |
document.querySelector('.pswp__button.pswp__button--arrow--right').click(); | |
} | |
function getCounterValue() { | |
const [position, total] = document.querySelector('.pswp__counter').textContent.split('/'); | |
return parseInt(position.trim(), 10); | |
} | |
async function run() { | |
await ensureCarouselVisible(); | |
await delay(500); | |
const firstValue = getCounterValue(); | |
async function preloadLoop() { | |
nextImage(); | |
await delay(50); | |
if (getCounterValue() !== firstValue) return preloadLoop(); // recurse | |
} | |
async function imageLoop() { | |
try { | |
await downloadImage(); | |
} catch (e) { | |
console.log('done!'); | |
return; | |
} | |
nextImage(); | |
await delay(100); | |
// console.log('counter', getCounterValue()); | |
if (getCounterValue() !== firstValue) return imageLoop(); // recurse | |
} | |
console.log('Running image preload, please wait...'); | |
await preloadLoop(); | |
console.log('Running download...'); | |
return imageLoop(); | |
} | |
run() | |
.then(() => | |
console.log('Download initiated, please wait until your download folder contains the full number of items.')) | |
.catch(console.error); |
@aronparsons Glad it's helped you. I've bought a lot of cars on BaT so I use this every 6-9mo or so!
STRML, I am not a coder so am relying on your expertise on this. The script has worked well for me up until now. For some reason, when I run the script in Chrome, I see the image flash once then it stops. Bottom line on the script adds this"
Promise {}
[[Prototype]]: Promise
[[PromiseState]]: "pending"
[[PromisResult]]: undefined
Has something changed in Chrome (or my settings) that is causing it to not download?
Great Script, hoping I can get it to work again.
Paul
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Worked like a charm in Chrome. Thanks! Made archiving the photos from a purchase easy.