Skip to content

Instantly share code, notes, and snippets.

@nikhilweee
Last active February 19, 2024 06:04
Show Gist options
  • Save nikhilweee/fdf7b471a31c2f1c2b9527c51d734d86 to your computer and use it in GitHub Desktop.
Save nikhilweee/fdf7b471a31c2f1c2b9527c51d734d86 to your computer and use it in GitHub Desktop.
Zotero re-download missing PDFs
async function replacePDF(item) {
// filter annotations, attachments, notes
if (!item.isRegularItem()) {
return;
}
let fileExists = [];
let oldPDF = null;
// filter multiple or existing PDFs
const attachmentIDs = item.getAttachments();
for (let itemID of attachmentIDs) {
const attachment = Zotero.Items.get(itemID);
if (!attachment.isPDFAttachment()) {
continue;
}
oldPDF = attachment;
const exists = await attachment.fileExists();
fileExists.push(exists);
}
if (fileExists.length > 1) {
return; // multiple PDFs found
}
if (fileExists.pop()) {
return; // PDF already exists
}
console.log("Updating PDF for", item.getDisplayTitle());
// manually invoke "Find Available PDF"
const newPDF = await Zotero.Attachments.addAvailablePDF(item);
if (oldPDF) {
await OS.File.move(newPDF.getFilePath(), oldPDF.getFilePath());
await newPDF.eraseTx();
}
}
// loop replacePDF() over all items in our library
const libraryID = Zotero.Libraries.userLibraryID;
let items = await Zotero.Items.getAll(libraryID);
for (let item of items) {
await replacePDF(item);
}
@nikhilweee
Copy link
Author

nikhilweee commented Feb 18, 2024

This script will scan your Zotero library for missing attachments and re-download them.

To run, click on Tools > Developer > Run JavaScript and paste this code. Make sure "Run as async function" is checked.
To view console logs, click on Tools > Developer > Error Console.

Here's the blog post about this: https://nikhilweee.me/blog/2024/zotero-file-sync/

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