blog.notmyidea.org/plugins/isbn_downloader.py

57 lines
1.7 KiB
Python

import logging
import os
from pathlib import Path
import requests
from pelican import log, signals
log = logging.getLogger(__name__)
def check_or_download_image(isbn, output_dir):
log.info(f"Downloading cover for {isbn=}")
output_dir = Path(output_dir)
# remote_url = f"https://images.isbndb.com/covers/41/83/{isbn}.jpg"
image_relative_path = f"images/isbn-covers/{isbn}.jpg"
image_path = output_dir / image_relative_path
if image_path.exists():
return image_relative_path
else:
try:
remote_url = f"https://www.googleapis.com/books/v1/volumes?q=isbn:{isbn}"
api_resp = requests.get(remote_url)
api_resp.raise_for_status()
returned = api_resp.json()
if returned["totalItems"] > 0:
thumbnail_url = returned["items"][0]["volumeInfo"]["imageLinks"][
"thumbnail"
]
response = requests.get(thumbnail_url, stream=True)
os.makedirs(os.path.dirname(image_path), exist_ok=True)
with open(image_path, "wb") as fp:
for chunk in response.iter_content(chunk_size=8192):
fp.write(chunk)
return image_relative_path
except:
log.error(
f"No ISBN cover found for {isbn=}. Look at https://isbnsearch.org/isbn/{isbn}"
)
return
def run_for_each_article(generator):
for article in generator.articles:
isbn = getattr(article, "isbn", None)
if isbn:
isbn = isbn.replace("-", "")
article.isbn_cover = check_or_download_image(isbn, generator.path)
def register():
signals.article_generator_finalized.connect(run_for_each_article)