Skip to content

Instantly share code, notes, and snippets.

@spf13
Forked from danmactough/script.js
Last active March 3, 2025 02:17
Show Gist options
  • Save spf13/1fee1eb88d65aca34272c99e4d68689d to your computer and use it in GitHub Desktop.
Save spf13/1fee1eb88d65aca34272c99e4d68689d to your computer and use it in GitHub Desktop.
Download all your Kindle books before Feb 26, 2025
// 1. Log in to your Amazon account
// 2. Go to your Content Library > Books - https://www.amazon.com/hz/mycd/digital-console/contentlist/booksAll/dateDsc/
// 3. Open your browser's Javascript console
// 4. For each page of books, paste this script into the console
(async function () {
// Close the notification if it appears
function closeNotification() {
const notifClose = document.querySelector("span#notification-close");
if (notifClose) {
notifClose.click();
}
}
// Pause for a given duration (in milliseconds)
function pause(duration = 1000) {
return new Promise(resolve => setTimeout(resolve, duration));
}
// Select all buttons that open the "Download & transfer via USB" dialog.
// Note: This uses the DOWNLOAD_AND_TRANSFER prefix.
const menus = Array.from(
document.querySelectorAll('div[id*="DOWNLOAD_AND_TRANSFER_ACTION_"]')
).filter(el => !el.id.endsWith("CONFIRM") && !el.id.endsWith("CANCEL"));
for (let menu of menus) {
// Extract the ASIN from the menu's id.
// E.g. "DOWNLOAD_AND_TRANSFER_ACTION_B07HYK662L" -> "B07HYK662L"
const parts = menu.id.split("_");
const asin = parts[parts.length - 1];
console.log(`Processing book with ASIN: ${asin}`);
// Click the menu to open the dialog
menu.click();
await pause(500);
// Within the dialog, select the first radio button (device) to download.
// This selector targets the list for this ASIN.
const inputSelector = `ul#download_and_transfer_list_${asin} li[class^='ActionList-module_action_list_item__'] > div > label`;
const input = document.querySelector(inputSelector);
if (!input) {
console.warn(`No download option found for ASIN ${asin}`);
continue;
}
input.click();
await pause(500);
// Find the confirm button within the dialog for this ASIN.
const buttonSelector = `div[id^='DOWNLOAD_AND_TRANSFER_DIALOG_${asin}'] div[class^='DeviceDialogBox-module_button_container__'] > div[id$='_CONFIRM']`;
const button = document.querySelector(buttonSelector);
if (!button) {
console.warn(`No confirm button found for ASIN ${asin}`);
continue;
}
button.click();
await pause(1000);
closeNotification();
await pause(500);
}
})();
@jefdavis54
Copy link

DOWNLOAD_AND_TRANSFER_ACTION_ is now DOWNLOAD_AND_TRANSFER_DIALOG_

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment