๐Ÿ“š API Buku (Proxy Google Books)

Endpoint ini bertindak sebagai perantara (proxy) untuk mengambil data buku dari Google Books berdasarkan ISBN.

๐Ÿ”— Endpoint

GET https://renaldo-api.vercel.app/api/book?isbn=9780143127741

๐Ÿงพ Parameter

๐Ÿ“ค Contoh Permintaan

GET https://renaldo-api.vercel.app/api/book?isbn=9786020324783
  

๐Ÿ“ฅ Contoh Respons JSON

{
  "totalItems": 1,
  "items": [
    {
      "volumeInfo": {
        "title": "The Martian",
        "authors": ["Andy Weir"],
        "publisher": "Crown Publishing Group",
        "publishedDate": "2014-02-11",
        "imageLinks": {
          "thumbnail": "https://books.google.com/books/content?id=...&printsec=frontcover&img=1&zoom=1"
        }
      }
    }
  ]
}
  

๐Ÿ”„ Integrasi dengan Open Library

Implementasi berikut menggunakan pendekatan Open Library sebagai sumber utama dan Google Books sebagai fallback kedua jika data tidak ditemukan di Open Library. Permintaan ke Google Books dilakukan melalui proxy API ini.

๐Ÿ› ๏ธ Contoh Implementasi di Google Apps Script

const PROXY_URL = "https://renaldo-api.vercel.app/api/book";

function getBookData(isbn) {
  isbn = isbn.toString().trim();
  if (!isbn) return ["ISBN kosong", "", "", "", ""];

  var data = fetchFromOpenLibrary(isbn);
  if (data[0] === "Tidak ditemukan") {
    data = fetchFromGoogleBooksViaProxy(isbn);
  }
  return data;
}

function fetchFromOpenLibrary(isbn) {
  var url = "https://openlibrary.org/api/books?bibkeys=ISBN:" + encodeURIComponent(isbn) + "&format=json&jscmd=data";
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  var key = "ISBN:" + isbn;

  if (!json[key]) {
    return ["Tidak ditemukan", "", "", "", ""];
  }

  var book = json[key];
  var title = book.title || "";
  var authors = book.authors ? book.authors.map(a => a.name).join(", ") : "";
  var publishDate = book.publish_date || "";
  var publishYear = extractYear(publishDate);
  var cover = (book.cover && book.cover.medium) ? book.cover.medium : "";
  var publishers = book.publishers ? book.publishers.map(p => p.name).join(", ") : "";

  return [title, authors, publishers, publishYear, cover];
}

function fetchFromGoogleBooksViaProxy(isbn) {
  var proxyUrl = PROXY_URL + "?isbn=" + encodeURIComponent(isbn);
  try {
    var response = UrlFetchApp.fetch(proxyUrl);
    var json = JSON.parse(response.getContentText());

    if (!json.totalItems || json.totalItems === 0) {
      return ["Tidak ditemukan", "", "", "", ""];
    }

    var volumeInfo = json.items[0].volumeInfo;

    var title = volumeInfo.title || "";
    var authors = volumeInfo.authors ? volumeInfo.authors.join(", ") : "";
    var publishers = volumeInfo.publisher || "";
    var publishDateRaw = volumeInfo.publishedDate || "";
    var publishYear = extractYear(publishDateRaw);
    var cover = (volumeInfo.imageLinks && volumeInfo.imageLinks.thumbnail) ? volumeInfo.imageLinks.thumbnail : "";

    return [title, authors, publishers, publishYear, cover];
  } catch (e) {
    return ["Error Proxy Google Books", "", "", "", ""];
  }
}

// ambil tahun dari string tanggal dalam berbagai format
function extractYear(dateString) {
  if (!dateString) return "";

  var parsedDate = new Date(dateString);
  if (!isNaN(parsedDate.getTime())) {
    return parsedDate.getFullYear().toString();
  }

  var match = dateString.match(/\b\d{4}\b/);
  if (match) return match[0];

  var monthNames = {
    jan: 0, feb: 1, mar: 2, apr: 3, may: 4, jun: 5,
    jul: 6, aug: 7, sep: 8, oct: 9, nov: 10, dec: 11
  };

  var parts = dateString.trim().split(" ");
  if (parts.length === 3) {
    var monthPart = parts[0].toLowerCase().substr(0, 3);
    var dayPart = parseInt(parts[1]);
    var yearPart = parseInt(parts[2]);
    if (monthNames.hasOwnProperty(monthPart) && !isNaN(dayPart) && !isNaN(yearPart)) {
      return yearPart.toString();
    }
  }

  return "";
}

๐Ÿš€ Dibuat oleh Renaldo Aluska | GitHub