Satu mesin,
banyak sumber.
API Alkitab berbasis Go dengan arsitektur adapter β local JSON sebagai default, scrape alkitab.mobi sebagai opsi. Satu binari, tanpa database, tanpa pernah mendistribusikan teks berhak cipta.
# jalankan dalam satu baris $ go run ./cmd/alkitab-api β listening on :3000 (scrape=false) # ambil satu ayat $ curl localhost:3000/v1/kjv/3john/1/4 { "version": "kjv", "verses": [ { "verse": 4, "content": "I have no greater joyβ¦" } ] }
Hak cipta adalah masalah arsitektur.
Sebagian besar terjemahan Alkitab β termasuk Terjemahan Baru β berstatus berhak cipta. Proyek ini menanggapinya bukan dengan mengabaikan, melainkan dengan merancang ulang: teks bawaan adalah domain-publik, akses ke terjemahan berhak cipta bersifat opt-in dan hanya terjadi saat runtime.
Bring Your Own Data
Mesin tidak membawa teks berhak cipta. Cukup letakkan berkas JSON di ALKITAB_DATA_DIR dan ia langsung terbaca di samping contoh domain-publik yang sudah tertanam.
Scrape adalah opt-in
Akses ke Terjemahan Baru tetap mungkin lewat adapter scrape yang diaktifkan dengan ALKITAB_SCRAPE=1 β sekadar proxy saat runtime, tanpa redistribusi.
Tiga lapis, satu arah
Transport, mesin, adapter. Dependensi hanya mengalir ke dalam. Itu yang membuat BYOD dan opt-in scrape bekerja tanpa menulis ulang inti.
#F5EFE1
#EFE7D4
#1C1813
#9A3B2D
#64703F
#9A7B2E
Tiga lapisan, dependensi mengalir ke dalam.
REST menyentuh mesin; mesin membungkus sebuah Source; adapter mengimplementasikan kontrak itu. Arahkan kursor atau ketuk tiap lapis untuk menonjolkannya.
7 rute: translations, books, chapter, verse, search, daily, random.
Membungkus satu Source. Menyimpan pasal agar tidak di-fetch ulang.
Menggabungkan source secara berurutan: local dulu, scrape saat tidak ada.
JSON + go:embed, di-scan di memori. Contoh KJV domain-publik tertanam.
Mengikis alkitab.mobi via goquery. Timeout 10s, body dibatasi 4 MiB, error tidak bocor.
Kapabilitas Corpus diperiksa lewat type assertion β search/daily/random jujur mengembalikan 501 saat sumber aktif tidak punya korpus.
Bagaimana satu GET menjadi ayat.
Dari path hingga JSON, setiap langkah melalui satu titik: Engine.
Menerima GET /v1/kjv/3john/1
Router Go 1.22 menangkap path values. {chapter} divalidasi numerik; bukan β 400.
Resolve book β id
ResolveBookID menerima id, nama Inggris, atau nama Indonesia (case-insensitive) dan menormalisasinya ke "3john".
Engine mengecek cache
Cache in-memory version:book:chapter dijamin RWMutex. Kena β langsung kembali. Luput β lanjut ke source.
Source menjawab (local, atau Chain β scrape)
local.Chapter membaca JSON tertanam. Jika versi tak ada dan scrape aktif, Chain meneruskan ke adapter scrape.
JSON keluar
Hasil di-cache, diserialisasi. Error bertipe memetakan ke kode status yang tepat β tak ada pesan internal yang bocor.
Tujuh rute, kontrak sederhana.
JSON masuk, JSON keluar. {book} menerima id, nama, atau singkatan β Inggris maupun Indonesia.
Terjemahan yang tersedia di source aktif (contoh tertanam + direktori data).
Daftar kitab, jumlah pasal, dan kategori PL/PB untuk satu terjemahan.
Seluruh ayat, termasuk judul bagian.
Disaring ke satu nomor ayat.
Substring case-insensitive di korpus lokal.
Deterministik per tanggal & versi (UTC).
Seed otomatis dari math/rand/v2.
Ambil ayat, langsung.
Coba ambil 3 Yohanes 1:4 dari server lokal, atau lihat contoh jika server belum berjalan.
// contoh respons (server belum dihubungi) { "version": "kjv", "book": "3john", "chapter": 1, "verses": [ { "verse": 4, "content": "I have no greater joy than to hear that my children walk in truth.", "type": "content", "order": 0 } ] }
βTidak ada teks berhak cipta di repositori ini β dan sengaja demikian.β
Contoh tertanam adalah domain-publik β KJV, hanya 3 Yohanes & Filemon. File runtime dengan id yang sama menimpa contoh tertanam. Terjemahan berhak cipta seperti TB Β© LAI hanya bisa diakses saat runtime lewat proxy scrape β tanggung jawab operator, bukan proyek.
ALKITAB_PORTport listen Β· default 3000ALKITAB_DATA_DIRdirektori terjemahan tambahanALKITAB_SCRAPE1 β aktifkan adapter scrapeALKITAB_BASE_URLbasis scrape Β· default alkitab.mobi// format BYOD β satu file per terjemahan { "translation": { "id": "tb", "name": "Terjemahan Baru", "language": "id" }, "books": [ { "id": "john", "name": "Yohanes", "abbr": "Yoh", "testament": "NT", "chapters": 21, "chapter_data": [ { "number": 1, "verses": [ { "verse": 1, "type": "content", "content": "β¦" } ] } ] } ] }