Hugoで書誌情報を取得してついでにAmazonアフィリエイトのリンクも表示できるショートコード作ってみた。 isbn=""の中にISBNコードを入れると、書誌情報が(あれば)表示される。Amazonアソシエイトのリンクもつけられるようにした。いろいろ増やせる。

{{< openbd isbn=“10桁or13桁” amzn=“URL” >}}

OpenBD とは?

openBD | 書誌情報・書影を自由に

私たちopenBDプロジェクト(カーリル・版元ドットコム)は書誌情報・書影を、だれでも自由に使える、高速なAPIで提供します。

という無料で利用できるAPIを使って書誌情報を取得しました。書影も取得できるので有難い。

openBD API 利用規約を読んでも、本の販促・紹介目的に限り使用できるという決まりはあるものの、それ以外の制約が少なく使いやすいと思いました。

他API

安心して利用できる図書館データの紹介 - Qiita という記事も参考になりました。

実装したショートコード

layouts/shortcodes/openbd.html

{{ $data := getJSON "https://api.openbd.jp/v1/get?isbn=" (.Get "isbn") }}

<div class="shortcode__openbd">
    {{ range $data }}
    {{ if ne .summary.cover "" }}<div class="cover-image"><img src="{{ .summary.cover }}"></div>{{ end }}
    <div class="summary">
        <span class="summary__title">{{ .summary.title }}</span>
        <span class="summary__author">{{ .summary.author }}</span>
        <span class="summary__publisher">{{ .summary.publisher }}</span>
    {{ end }}
    {{ with .Get "amzn" }}<a href="{{ . }}" class="amzn-associate-link">Amazonで見る</a>{{ end }}
    </div>
</div>

リモートデータを取得するgetJSONを使います。APIを叩いて簡潔にsummaryにある内容を取得しました。たまにカバー画像がないこともあるようなので、空値でない条件で表示。

関係ないけどJSONデータを可視化してくれるオンラインツール JSON Crack が便利。

カスタムショートコードの作り方

ざっくりと言えばlayouts\shotcodesディレクトリ内にショートコード名をつけたmyshortcode.htmlを作成してその中に色々書きます。 今回はopenbdという名前でショートコードを作るので、ファイル名はopenbd.htmlで保存して上記コードを書く。

ファイルキャッシュについて

正直あまり理解できているとは言い難いのですが、Cache URLsの解説に

Each downloaded URL will be cached in the default folder $TMPDIR/hugo_cache/. The variable $TMPDIR will be resolved to your system-dependent temporary directory.

With the command-line flag --cacheDir, you can specify any folder on your system as a caching directory.

とあり、Configure File CachesによるとgetJSONしたURLのキャッシュのデフォルト設定は以下が指定されるようです。

  [caches.getjson]
    dir = ':cacheDir/:project'
    maxAge = -1

-1が指定されているので無期限にキャッシュが保存されるんだろうか……。ビルド時に--ignoreCacheをオプションに指定するとキャッシュディレクトリを無視することができる。

maxAge

This is the duration before a cache entry will be evicted, -1 means forever and 0 effectively turns that particular cache off.

参考