CoolFace
Apppublic

FRS24/academic-aggregator

sourceHugging Faceupdated 2mo agoView on Hugging Face
0likes
App README

๐Ÿ“š Academic Aggregator

Academic Aggregator adalah mesin pencari akademis berbasis web yang mengumpulkan artikel, jurnal, dan e-book dari berbagai sumber open access dan gratis. Dibangun dengan FastAPI + SQLite, dirancang untuk membantu mahasiswa, peneliti, dan akademisi dalam menyelesaikan tugas akhir, skripsi, atau riset.

โœจ Fitur Utama

  • โ€”๐Ÿ” Multi-Source Search โ€” Mencari artikel dari 15+ sumber sekaligus (OpenAlex, arXiv, PubMed, DOAJ, BASE, Semantic Scholar, CORE, Unpaywall, dll.)
  • โ€”๐Ÿ“„ Full-Text Parsing โ€” Baca dan ekstrak konten dari PDF, EPUB, DOCX (termasuk OCR untuk gambar)
  • โ€”๐Ÿง  AI-Powered Search Engine โ€” Integrasi dengan Semantic Scholar, Consensus, dan Elicit (scraping)
  • โ€”๐Ÿ“š E-Book Indexing โ€” Upload e-book, di-index, dan bisa dicari isinya secara lokal (Whoosh)
  • โ€”๐ŸŒ Multi-Layer Architecture โ€” Provider dibagi menjadi 3 layer: Free (no key), Key-based, dan Scraping (fallback)
  • โ€”๐Ÿ”’ Safe & Legal โ€” Hanya menggunakan sumber open access dan repository resmi (SCI-HUB opsional)
  • โ€”๐Ÿณ Docker-Ready โ€” Jalankan dengan satu perintah docker-compose up -d
  • โ€”๐Ÿ“ฆ Modular & Extensible โ€” Tambahkan sumber baru dengan mudah (tinggal buat file di providers/)

๐Ÿ› ๏ธ Teknologi

KomponenTeknologi
BackendFastAPI + Uvicorn
ORMSQLAlchemy (Async)
DatabaseSQLite (default), PostgreSQL (opsional)
FrontendJinja2 + Bootstrap 5 + HTMX
ParsingPyPDF2, pdfplumber, PyMuPDF, ebooklib, python-docx
ScrapingBeautifulSoup4, lxml, httpx, scholarly
IndexingWhoosh (FTS5)
ContainerDocker + Docker Compose

๐Ÿ“‹ Prasyarat

  • โ€”Python 3.11+ (jika tanpa Docker)
  • โ€”Docker & Docker Compose (jika pakai Docker)
  • โ€”Minimal 2GB RAM
  • โ€”Koneksi internet stabil

๐Ÿš€ Instalasi & Menjalankan

Opsi 1: Menggunakan Docker (Rekomendasi)

  1. 1.Clone repository
bash
   git clone https://github.com/yourusername/academic-aggregator.git
   cd academic-aggregator
  1. 1.Setup environment
bash
   cp .env.example .env
   nano .env   # isi API keys (optional, yang gratis)
  1. 1.Build & run
bash
   docker-compose up -d --build
  1. 1.Akses aplikasi Buka browser: http://localhost:8000
  1. 1.Stop
bash
   docker-compose down

Opsi 2: Manual (Tanpa Docker)

  1. 1.Buat virtual environment
bash
   python3 -m venv venv
   source venv/bin/activate  # Linux/Mac
   # atau
   venv\Scripts\activate     # Windows
  1. 1.Install dependencies
bash
   pip install -r requirements.txt
  1. 1.Setup environment
bash
   cp .env.example .env
   nano .env   # isi konfigurasi
  1. 1.Buat folder data
bash
   mkdir -p data/db data/uploads data/cache
  1. 1.Jalankan aplikasi
bash
   uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
  1. 1.Akses aplikasi Buka browser: http://localhost:8000

๐Ÿ“ Struktur Project

academic-aggregator/
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ .env.example
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ README.md
โ”‚
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ main.py
โ”‚   โ”œโ”€โ”€ config.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”œโ”€โ”€ base.py                 # BaseProvider (abstract)
โ”‚   โ”‚   โ””โ”€โ”€ registry.py             # Registry (provider manager)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ models/
โ”‚   โ”‚   โ”œโ”€โ”€ database.py
โ”‚   โ”‚   โ”œโ”€โ”€ article.py
โ”‚   โ”‚   โ””โ”€โ”€ ebook.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ providers/
โ”‚   โ”‚   โ”œโ”€โ”€ layer_1_free/           # OpenAlex, arXiv, PubMed, DOAJ, BASE
โ”‚   โ”‚   โ”œโ”€โ”€ layer_2_key/            # Semantic Scholar, CORE, Unpaywall
โ”‚   โ”‚   โ””โ”€โ”€ layer_3_scrape/         # Google Scholar, Consensus, Elicit, dll.
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ resolvers/
โ”‚   โ”‚   โ”œโ”€โ”€ scihub.py
โ”‚   โ”‚   โ””โ”€โ”€ unpaywall_resolver.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ routes/
โ”‚   โ”‚   โ”œโ”€โ”€ pages.py
โ”‚   โ”‚   โ”œโ”€โ”€ search.py
โ”‚   โ”‚   โ”œโ”€โ”€ upload.py
โ”‚   โ”‚   โ””โ”€โ”€ read.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ utils/
โ”‚   โ”‚   โ”œโ”€โ”€ parsers.py
โ”‚   โ”‚   โ”œโ”€โ”€ indexer.py
โ”‚   โ”‚   โ”œโ”€โ”€ dedup.py
โ”‚   โ”‚   โ””โ”€โ”€ proxy.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ templates/
โ”‚   โ”‚   โ”œโ”€โ”€ base.html
โ”‚   โ”‚   โ”œโ”€โ”€ index.html
โ”‚   โ”‚   โ””โ”€โ”€ results.html
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ static/
โ”‚       โ”œโ”€โ”€ css/
โ”‚       โ””โ”€โ”€ js/
โ”‚
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ db/
โ”‚   โ””โ”€โ”€ uploads/
โ”‚
โ””โ”€โ”€ tests/
    โ”œโ”€โ”€ test_providers/
    โ””โ”€โ”€ test_parsers.py

โš™๏ธ Konfigurasi (.env)

VariableDeskripsi
DB_URLDatabase URL (SQLite/PostgreSQL)
SEMANTIC_SCHOLAR_API_KEYAPI key Semantic Scholar (gratis)
CORE_API_KEYAPI key CORE (gratis)
UNPAYWALL_API_KEYAPI key Unpaywall (gratis)
ENABLE_OPENALEXEnable/disable OpenAlex (1/0)
ENABLE_GOOGLE_SCHOLAREnable/disable scraping Google Scholar (default: 0)
ENABLE_SCI_HUBEnable/disable SCI-HUB resolver (default: 0)
PROXY_ROTATOR_ENABLEDAktifkan proxy rotator untuk scraping
Catatan: Isi API key hanya jika ingin menggunakan provider layer 2. Provider layer 1 (OpenAlex, arXiv, PubMed, DOAJ, BASE) tidak butuh API key.

๐Ÿงช Testing

bash
pytest tests/ -v

๐Ÿ“– Cara Penggunaan

1. Mencari Artikel

  • โ€”Buka http://localhost:8000
  • โ€”Masukkan keyword di form search
  • โ€”Pilih sumber (atau biarkan semua)
  • โ€”Klik "Search"
  • โ€”Hasil akan muncul dalam bentuk card dengan judul, penulis, tahun, abstrak, dan sumber

2. Membaca Full-Text

  • โ€”Klik tombol "Baca Full Text" pada card artikel
  • โ€”Akan diarahkan ke halaman baca dengan teks lengkap (jika tersedia)

3. Upload E-Book

  • โ€”Klik tab "Upload E-Book"
  • โ€”Pilih file (PDF/EPUB/DOCX)
  • โ€”Tunggu proses parsing & indexing
  • โ€”Nanti bisa dicari isinya melalui fitur "Search E-Book"

4. Download Article

  • โ€”Pada halaman hasil, klik icon download untuk menyimpan file PDF (jika tersedia)

๐Ÿ”Œ Menambahkan Sumber Baru

  1. 1.Buat file baru di providers/layer_1_free/ atau layer_2_key/ atau layer_3_scrape/
  2. 2.Import BaseProvider dari core/base.py
  3. 3.Implementasikan method fetch(query) dan parse(response)
  4. 4.Tambahkan provider ke registry.py

Contoh:

python
# providers/layer_1_free/example.py
from app.core.base import BaseProvider

class ExampleProvider(BaseProvider):
    source_name = "Example"
    base_url = "https://api.example.com"

    async def fetch(self, query: str, limit: int = 10):
        # Implementasi fetch
        pass

    async def parse(self, raw_data: dict):
        # Implementasi parse
        pass

๐Ÿ›ก๏ธ Keamanan & Privasi

  • โ€”Tidak menyimpan data pribadi user
  • โ€”Semua file upload disimpan di data/uploads/ (tidak di-share ke publik)
  • โ€”API key disimpan di environment, tidak terekspos di frontend
  • โ€”Semua request melalui HTTPS (jika di-deploy dengan SSL)

๐Ÿ“„ Lisensi

MIT License โ€” silakan digunakan, dimodifikasi, dan didistribusikan.