🏡 index : github.com/captn3m0/epub-metadata-generator.git

const OL = require("./openlibrary");
const fs = require("fs");
const XML = require("xmlbuilder");

function _convert(data, pretty) {
  let contents = XML.create("package");
  contents.att("unique-identifier", "uuid_id")
  contents.att('xmlns', 'http://www.idpf.org/2007/opf')

  let metadata = contents.ele("metadata");
  metadata.att("xmlns:opf","http://www.idpf.org/2007/opf")
  metadata.att("xmlns:dc","http://purl.org/dc/elements/1.1/")

  for (let key in data.industryIdentifiers) {
    let d = data.industryIdentifiers[key];
    metadata.ele(
      "dc:identifier",
      { "opf:scheme": d["type"] },
      d["identifier"][0]
    );
  }

  for (let i in data.authors) {
    metadata.ele("dc:creator", { "opf:role": "aut" }, data.authors[i]);
  }

  metadata.ele("dc:title", { id: "title" }, data.title);

  if (undefined !== data.description) {
    metadata.ele("dc:title", { id: "subtitle" }, data.description);
    metadata.ele(
      "meta",
      { refines: "#subtitle", property: "title-type" },
      "subtitle"
    );
  }

  metadata.ele("dc:language", {}, data.language);
  metadata.ele("dc:publisher", {}, data.publisher);

  let date = new Date(Date.parse(data.publishedDate));

  function pad(number) {
    if (number < 10) {
      return "0" + number;
    }
    return number;
  }

  let epubDate =
    date.getUTCFullYear() +
    "-" +
    pad(date.getUTCMonth() + 1) +
    "-" +
    pad(date.getUTCDate());

  metadata.ele("dc:date", {}, epubDate);


  if (undefined !== data.imageLinks.large) {
    metadata.ele("dc:identifier", { id: "cover-url" }, data.imageLinks.large);
  }

  let blob = contents.end({ pretty: pretty });
  return blob;
}

module.exports = {
  write: function(filepath, isbn) {
    OL.lookup(isbn, function(err, data) {
      fs.writeFileSync(filepath, _convert(data, true));
    });
  },
  _convert: _convert
};