Skip to content

Instantly share code, notes, and snippets.

@usayamadx
Forked from jkubecki/ExportKindle.js
Last active June 30, 2024 21:48
Show Gist options
  • Save usayamadx/9c638d9b70bc714d6dd6043fcd54085f to your computer and use it in GitHub Desktop.
Save usayamadx/9c638d9b70bc714d6dd6043fcd54085f to your computer and use it in GitHub Desktop.
Amazon Kindle Export
// init
let xhr = new XMLHttpRequest()
let domain = 'https://read.amazon.com/'
let items = []
let csvData = ""
// function
function getItemsList(paginationToken = null) {
let url = domain + 'kindle-library/search?query=&libraryType=BOOKS' + ( paginationToken ? '&paginationToken=' + paginationToken : '' ) + '&sortType=recency&querySize=50'
xhr.open('GET', url, false)
xhr.send()
}
// request result
xhr.onreadystatechange = function() {
switch ( xhr.readyState ) {
case 0:
console.log('uninitialized')
break
case 1:
console.log('loading...')
break
case 4:
if(xhr.status == 200) {
let data = xhr.responseText
data = JSON.parse(data)
if(data.itemsList) {
items.push(...data.itemsList)
}
if(data.paginationToken) {
getItemsList(data.paginationToken)
}
} else {
console.log('Failed')
}
break
}
}
// action
getItemsList()
// to csv
items.forEach(item => {
csvData += '"' + item.asin + '","' + item.title + '"\n'
})
window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(csvData)
@nbijbi
Copy link

nbijbi commented Dec 4, 2021

I am a js novice, but this isn't working for me. on a new install of win 11, getting this error.

image

seeing some data, just titles, but can't parse this.

image

@pdollar88
Copy link

I appreciate this! This export all of my titles, but did not export any additional details like author information. Would love if that would be captured.

@nickbaldwin-monster
Copy link

nickbaldwin-monster commented Jul 26, 2022

if you'd like some of the extra properties, use this. I've commented out the percentageRead (as it always shows 0 for me), originType (same for all my books) and mangaOrComicAsin (not relevant for my stuff) - but you remove all the // preceding those lines, you'll get everything

it looks like that all authors are included in a single item in an array, but this code will deal with additional items

finally, the search order is changed to use the order of purchase - which will make it easier to identify just new items when exporting the list again later

@pdollar88 @betsy-2063 @darryllee - very late but just in case you're interested...

// init
let xhr = new XMLHttpRequest()
let domain = 'https://read.amazon.com/'
let items = []
let csvData = ""

// function
function getItemsList(paginationToken = null) {
  let url = domain + 'kindle-library/search?query=&libraryType=BOOKS' + ( paginationToken ? '&paginationToken=' + paginationToken : '' ) + '&sortType=acquisition_desc&querySize=50'
  xhr.open('GET', url, false)
  xhr.send()  
}

// request result
xhr.onreadystatechange = function() {
  switch ( xhr.readyState ) {
    case 0:
      console.log('uninitialized')
      break
    case 1:
      console.log('loading...')
      break
    case 4:
      if(xhr.status == 200) {
        let data = xhr.responseText
        data = JSON.parse(data)
        if(data.itemsList) {
          items.push(...data.itemsList)
        }
        if(data.paginationToken) {
          getItemsList(data.paginationToken)
        }
      } else {
        console.log('Failed')
      }
      break
  }
}

// action
getItemsList()

// to csv
items.forEach(item => {

  let authorNames = "";
  item.authors.forEach(author => {
    let authorsList = author.split(":");
    let prevAuthor = "";
    authorsList.forEach((a, _i) => {
      // ignore duplicate name and last item (empty string)
      if (a !== prevAuthor && _i < authorsList.length - 1) {
        authorNames += a + '; '
        prevAuthor = a;
      }
    }); 
  }); 

  csvData += 
    '"' + item.asin + 
    '","' + 
    item.title + 
    '","' + 
    authorNames + 
    '","' + 
    item.webReaderUrl + 
    '","' + 
    item.productUrl + 
    '","' + 
    item.resourceType + 
    // '","' + 
    // item.percentageRead + 
    // '","' +  
    // item.originType + 
    // '","' + 
    // mangaOrComicAsin +
    '"\n'

})
window.location = 'data:text/csv;charset=utf8,' + `encodeURIComponent(csvData)

@nickbaldwin-monster
Copy link

thanks so much to @usayamadx - really appreciate this!

@AppMakerSupreme
Copy link

I improved upon @usayamadx logic and made a Chrome extension to solve this problem: Kindle Book List Exporter

You can now get a csv file in 1 click. No need to deal with any code or console.

Please let me know if it works for you.

@readytheory
@nickbaldwin-monster
@MrMikey59
@pdollar88
image

@berkeleysquare
Copy link

THANKS @usayamadx ! Awesome.
I, too, had something that prevented the download. I put it in a blob and it works great:

// init
let xhr = new XMLHttpRequest()
let domain = 'https://read.amazon.com/'
let items = []
let csvData = ""

const formatBook = item => '"' + item.asin + '","' + item.title + '","' + (item.authors || [])[0] + '"\n';

// function
function getItemsList(paginationToken = null) {
let url = domain + 'kindle-library/search?query=&libraryType=BOOKS' + ( paginationToken ? '&paginationToken=' + paginationToken : '' ) + '&sortType=recency&querySize=50'
xhr.open('GET', url, false)
xhr.send()
}

// request result
xhr.onreadystatechange = function() {
switch ( xhr.readyState ) {
case 0:
console.log('uninitialized')
break
case 1:
console.log('loading...')
break
case 4:
if(xhr.status == 200) {
let data = xhr.responseText
data = JSON.parse(data)
if(data.itemsList) {
items.push(...data.itemsList)
}
if(data.paginationToken) {
getItemsList(data.paginationToken)
}
} else {
console.log('Failed')
}
break
}
}

// action
getItemsList()

// to csv
items.forEach(item => {
csvData += formatBook(item);
})
const blobCSV = new Blob([csvData], {type: 'text/plain;charset=utf-8'});
blobURL = URL.createObjectURL(blobCSV);
window.location = blobURL;

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