Bibliojocs — directori de jocs educatius PWA
  • JavaScript 72.3%
  • Python 15.4%
  • Vue 5.2%
  • CSS 4.5%
  • HTML 2.5%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Samuel Soriano 411176a09e
Some checks are pending
Frontend Vue / browser (push) Waiting to run
Label Play resources and filter the catalogue by application
2026-10-22 12:10:21 +02:00
.github/workflows Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
assets Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
data Update moved felipsarroca activity URLs 2026-10-20 08:26:59 +02:00
docs Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
reports Audita catálogo: retira 1017 enlaces (privacidad, obsoletos, no-juegos y flash casual) 2026-09-06 16:12:24 +02:00
scripts Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
src Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
styles Migrate resource proposals to Vue with persistent confirmation 2026-10-22 09:16:19 +02:00
tests Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
.dockerignore Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
.gitignore Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
API-IMPORT-README.md Oculta rutes internes i usuaris locals de la documentació 2026-09-10 21:20:10 +02:00
BLOG_POST.md 1.0.2 2026-05-08 22:27:56 +02:00
Dockerfile Fix: actividades Flash no cargaban en Commons (Ruffle ausente, 404 enmascarado) 2026-09-20 13:58:24 +02:00
ESTRUCTURA-ACTUALIZADA.md Oculta rutes internes i usuaris locals de la documentació 2026-09-10 21:20:10 +02:00
favicon.ico Add favicon.ico (new logo) and remove link-status banner 2026-09-09 07:29:35 +02:00
index.html Migrate administrative resource sources panel to Vue 2026-10-22 09:22:11 +02:00
jclic.html Add local JClic viewer (jclic.html + jclic.js bundle); bump SW 2026-09-09 12:31:25 +02:00
LICENSE chore: add AGPL-3.0 license 2026-09-07 08:50:10 +02:00
manifest.json Migra domini a recursos.edutictac.es i renomena a Banc de recursos 2026-09-06 19:33:26 +02:00
nginx.local.conf Fix: actividades Flash no cargaban en Commons (Ruffle ausente, 404 enmascarado) 2026-09-20 13:58:24 +02:00
package-lock.json Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
package.json Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
playwright.config.js Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00
PROJECT_STATE.md Oculta rutes internes i usuaris locals de la documentació 2026-09-10 21:20:10 +02:00
QUICKSTART-APIS.md feat: importador educativo en modo demo y pruebas de APIs públicas 2026-05-06 14:43:13 +02:00
README.md Protect preferences during bank session changes and finish Vue cleanup 2026-10-22 09:24:35 +02:00
robots.txt Migra domini a recursos.edutictac.es i renomena a Banc de recursos 2026-09-06 19:33:26 +02:00
SISTEMA-APIS-RESUMEN.md feat: importador educativo en modo demo y pruebas de APIs públicas 2026-05-06 14:43:13 +02:00
sitemap.xml Migra domini a recursos.edutictac.es i renomena a Banc de recursos 2026-09-06 19:33:26 +02:00
sw.js Label Play resources and filter the catalogue by application 2026-10-22 12:10:21 +02:00
vite.config.mjs Migrate resource catalogue and preferences to Vue 2026-10-22 08:12:34 +02:00

Banc de recursos

Directori de jocs educatius per a Infantil, Primària i Secundària. Lloc estàtic (HTML + CSS, interfície Vue precompilada i mòduls JavaScript) amb sincronització via API autoalojada (FastAPI + SQLite).

🌐 Producció: recursos.edutictac.es


Índex


Estructura del projecte

├── index.html                  Pàgina principal
├── sw.js                       Service Worker (PWA)
├── data/
│   ├── games.json              Catàleg principal d'activitats
│   ├── games-home.json         Subconjunt per la càrrega inicial (generat)
│   └── archive-flash-staging.json  Entrades pendents de revisió (Archive.org)
├── assets/
│   ├── game-images/            Captures de pantalla dels jocs
│   └── flash/                  Fitxers .swf locals (NO estan en git)
├── reports/
│   └── link-report.json        Informe d'estat dels enllaços (generat)
├── scripts/
│   ├── check-links.mjs         Verificador d'enllaços
│   ├── generate-home.mjs       Genera games-home.json
│   ├── import-csv.mjs          Importa des de CSV
│   ├── import-wordpress.mjs    Importa des de WordPress
│   ├── import-archive-flash.mjs  Importa Flash educatiu d'Archive.org
│   ├── capture-game-images.mjs Captura automàtica d'imatges
│   └── deploy.sh               Script de deploy per SSH
└── styles/
    └── site.css

Instal·lació

git clone https://github.com/sasogu/recursos.git
cd recursos
npm ci --ignore-scripts
npm run build
npm test

Cal Node 22.12 o posterior per a compilar. El bundle versionat permet servir el lloc amb nginx sense Node en execució. El pla Vue recull l’arquitectura i les comprovacions del catàleg, accés, propostes i fonts, ja migrats. Els motors Flash/JClic i el lector de llibres es conserven.


Gestió del catàleg

El catàleg és data/games.json. Cada entrada té aquest format:

{
  "id": "id-unic",
  "title": "Títol del joc",
  "title_ca": "Títol en català (opcional)",
  "area": "Matematicas",
  "language": "Castellano",
  "url": "https://exemple.com/joc",
  "notes": "Descripció breu",
  "notes_ca": "Descripció en català (opcional)",
  "levels": ["Primaria 1er ciclo", "Primaria 2o ciclo"],
  "image": "assets/game-images/nom-del-joc.png",
  "flash": true
}

Camps obligatoris: id, title, url

Valors vàlids per area: Matematicas, Lengua, Ciencias Naturales, Sociales, Plastica, Musica, Ingles, Educación Física, Informática, Logica, General, Seguridad Digital, Tecnologia, Religion, Frances

Valors vàlids per levels: Infantil, Primaria, Primaria 1er ciclo, Primaria 2o ciclo, Primaria 3er ciclo, Secundaria

Valors vàlids per language: Castellano, Català/Valencià, Inglés, Francés, Aranes

El camp flash: true activa el reproductor Ruffle integrat per a fitxers .swf.


Importació de continguts

Des de CSV

Format de les columnes: id,title,area,level,language,url,notes

npm run import:csv                          # llegeix data/games.csv
node scripts/import-csv.mjs ruta/arxiu.csv  # fitxer alternatiu

Des de WordPress

npm run import:wp          # importació completa
npm run import:wp:merge    # fusiona amb el catàleg existent
npm run import:wp:images   # descarrega imatges de WordPress

Flash educatiu d'Archive.org

Descarrega jocs Flash educatius d'Archive.org i els allotja localment (necessari perquè Archive.org està bloquejat a les xarxes escolars).

# 1. Cerca sense descarregar (per veure quants jocs hi ha)
npm run import:flash:dry

# 2. Descàrrega real (es pot aturar i reprendre)
npm run import:flash

# 3. Opcions avançades
node scripts/import-archive-flash.mjs --limit 50
node scripts/import-archive-flash.mjs --query "math elementary"

# 4. Revisa data/archive-flash-staging.json i elimina els que no vulguis

# 5. Afegeix els aprovats a games.json
npm run import:flash:apply

Notes:

  • Els .swf es guarden a assets/flash/ i no estan en git (massa pesats), però el deploy els puja al servidor via rsync.
  • El script és resumible: guarda el progrés a data/archive-flash-state.json.
  • Mida màxima per fitxer: 100 MB.
  • Mapatge automàtic de matèries, idiomes i etapes a partir dels tags d'Archive.org.

Captura d'imatges

Genera captures de pantalla automàtiques per als jocs sense imatge usant Chromium en mode headless:

npm run capture:images -- --limit 25        # fins a 25 captures
npm run capture:images -- --id nom-del-joc  # un joc concret
npm run capture:images -- --host clic.xtec.cat --limit 50
npm run capture:images -- --force           # força recaptura
npm run capture:images -- --dry-run        # simula sense escriure

Variables d'entorn opcionals: CHROMIUM_BIN, BROWSER_BIN


Verificació d'enllaços

npm run check:links               # verifica tots els URL del catàleg
STRICT_WARNINGS=true npm run check:links  # tracta avisos com a errors

Genera reports/link-report.json amb l'estat HTTP de cada URL. La interfície mostra el resultat directament a cada targeta.

El workflow .github/workflows/link-check.yml executa la verificació diàriament de forma automàtica.


API autoalojada (substitució de Firebase)

La app funciona en dos modes:

Mode Favorits Valoracions Sincronització
Local (per defecte) localStorage localStorage No
Remot API pròpia per usuari API pròpia compartides Sí (tots els dispositius)

La sincronització en el núvol ja no usa Firebase: es fa contra una API REST pròpia (FastAPI + SQLite) servida a recursos.edutictac.es/api/ (migració 2026-09-04, repositori Edutictac/recursos-api).

  • La URL de l'API es pot sobreescriure amb window.EDUBIBLIOJOCS_API_BASE (per defecte /api, mateix origen).
  • Identitat anònima per cookie (sense Google).
  • Mode admin: entra amb Authentik des del botó Entrar. Els correus configurats en OIDC_ADMIN_EMAILS activen els filtres "No funciona (admin)" i "Reportades (admin)".

Estructura de dades (SQLite)

favorites(user_id, game_key)      → favorits per usuari
ratings(user_id, game_key, value) → valoració personal (1-5)
reports(user_id, game_key)        → reportes "no funciona" per usuari
rating_summary(game_key, sum, count, avg) → valoració agregada
broken_reports(game_key, count, admin_reported) → reportes agregats
submissions(id, title, url, ...)  → activitats proposades pels usuaris

Funcions d'administrador

El mode admin permet veure:

  • Filtre "No funciona (admin)": activitats amagades (≥ 3 reports d'usuaris o marcades per l'admin).
  • Filtre "Reportades (admin)": activitats amb 1-2 reports, visibles però vigilades.
  • Ocultar activitat: marca una activitat com a no funcional perquè deixe d'aparéixer al llistat públic sense modificar els JSON d'origen.

Deploy

Deploy ràpid (sense verificació d'enllaços)

npm run deploy:fast

Deploy complet (amb verificació d'enllaços)

npm run deploy

Simulació sense pujar res

npm run deploy:dry

Variables de configuració del deploy

Variable Per defecte Descripció
DEPLOY_HOST example.org Host del servidor
DEPLOY_USER user Usuari SSH
DEPLOY_PORT 22 Port SSH
DEPLOY_PATH /var/www/example Ruta remota
DEPLOY_SSH_KEY — Clau privada SSH
DRY_RUN=1 — Simula sense copiar
SKIP_LINKS=1 — Omet la verificació d'enllaços
SKIP_VERIFY=1 — Omet la verificació post-deploy
FIX_PERMS=1 1 Ajusta permisos (dirs 755, fitxers 644)

Deploy automàtic via GitHub Actions

El workflow .github/workflows/deploy.yml fa el deploy automàticament en fer push a main. Configura aquests Secrets a GitHub (Settings → Secrets → Actions):

  • DEPLOY_HOST, DEPLOY_USER, DEPLOY_PATH, DEPLOY_SSH_KEY, DEPLOY_PORT

Llicència

Codi: GNU Affero General Public License v3.0 (AGPL-3.0). El catàleg d'activitats i els seus continguts pertanyen als autors respectius (p. ex. clic.xtec.cat).

Històries de Llibres

El catàleg incorpora GET /api/llibres/books del mateix recursos-api i reutilitza el visor iframe per al format llibres, amb sandbox sense scripts. Comparteix publicació, portada i enllaç de lectura amb «Històries compartides» de Llibres. La consulta pública no necessita sessió. Les retirades es reflectixen en tornar a carregar el catàleg; el service worker no guarda les rutes /api/llibres/. No executa projectes .elpx: l'editable opcional només es descarrega des del lector.