Un sitio Drupal que tu equipo puede extender. Una API que cualquier stack puede consumir.
gtfs.media es una suite de módulos GPL‑2.0+ sobre Drupal 10/11 estándar. Si trabajas en Drupal, ya conoces este sistema — entidades, campos, Views, permisos, config sync, aplicados al tránsito. Esta página cubre cómo se configura un despliegue, qué expone y cómo encaja con el sitio que ya operas.
En lenguaje sencillo
Esta página es para personas que construyen sitios web.
El software es un conjunto de módulos para Drupal. Los instalas de la misma manera que instalas cualquier otro módulo.
Leen tu archivo GTFS. Almacenan cada parte como contenido normal de Drupal, para que puedas añadir tus propios campos.
Cada pantalla y mapa lee una API pública. Tu propio código puede leer la misma.
Los datos residen en servidores que tú controlas.
Cómo se configura un despliegue
Un sitio gtfs.media es una instalación estándar de Drupal con la suite GTFS habilitada. El módulo gtfs modela la especificación como entidades de contenido e importa tu zip publicado — importa una vez, reimporta siempre; las actualizaciones llegan en su lugar y las adiciones manuales sobreviven. gtfs_rt consulta tus endpoints Protobuf en horarios por feed y republica JSON. La pila de pantallas renderiza kioscos y mapas como clientes de esa misma API.
Varios feeds pueden funcionar en paralelo, por lo que las configuraciones regionales y de múltiples operadores son un solo sitio.
# A standard Drupal 10/11 site composer require drupal/gtfs drupal/gtfs_rt drupal/gtfs_display drush en gtfs gtfs_rt gtfs_display # then in the admin UI: # /admin/gtfs add a feed, run the import wizard # /admin/gtfs/rt point at your GTFS-RT endpoints # /admin/gtfs/display create display contexts
Se comporta como el Drupal que conoces
Los feeds y contextos de pantalla son entidades de configuración: constrúyelos en la interfaz de administración, expórtalos con el resto de tu configuración, revísalos en git, despliégalos a través del pipeline que el sitio ya usa.
- Entidades de contenido — rutas, paradas y viajes son contenido con campos y traducible; añade páginas de destino o metadatos adicionales como con cualquier nodo
- Views — consulta y lista datos GTFS con la misma herramienta con la que construyes cualquier otro listado
- View modes y theming — renderiza registros de tránsito con tu tema, no el nuestro
- Roles y permisos — los permisos de API y el acceso por pantalla utilizan el sistema de permisos que ya administras
- Tus servidores, tus datos — feeds importados, cachés en tiempo real y telemetría de pantallas viven en una base de datos que tú administras, en plataformas que tú controlas
¿Desarrollando para un operador del Área de la Bahía? El módulo de aprovisionamiento 511 configura cada feed desde un solo formulario de ajustes, y GTFS+ ya está modelado.
Nuestras superficies consumen la misma API que tú usarías.
Cada pantalla y mapa de la plataforma es un cliente de la API JSON versionada — no existe una ruta interna privilegiada. Lo que cada endpoint expone, y a quién, es una decisión de permisos que tomas por rol. La referencia completa de la API documenta cada endpoint, parámetro y forma de respuesta.
- Protobuf entra, JSON sale — las actualizaciones de viajes, posiciones de vehículos y alertas de servicio GTFS‑Realtime se decodifican del lado del servidor; los consumidores nunca tocan Protobuf
- Frescura bajo demanda — una pantalla que solicita datos activa una actualización asíncrona de cualquier feed obsoleto, para que las pantallas activas mantengan los feeds calientes
- Hooks de mapeo de ID — cuando los IDs de parada en tiempo real no coinciden con tu feed estático (a menudo no coinciden), un hook los reconcilia
# Static GTFS, served as JSON
GET /gtfs/api/v2/feeds/{feed}/stops/{stop_id}
GET /gtfs/api/v2/feeds/{feed}/stops/{stop_id}/routes
# Realtime
GET /gtfs/api/v2/rt/tripupdates/{stop_id}
GET /gtfs/api/v2/rt/vehicles?stop_id={stop_id}
GET /gtfs/api/v2/rt/alerts/stops/{stop_id}
// One canonical prediction shape,
// however messy the upstream feed
{
"trip_id": "t_48151",
"route_id": "17",
"stop_id": "4021",
"predicted_arrival_epoch": 1766920841,
"delay": 120,
"vehicle_id": "2214",
"headsign": "Airport via Union Station",
"is_last_stop": false
}
Convenciones de respuesta
- REST predecible — endpoints versionados bajo
/gtfs/api/v2/, envolturas consistentes, marcas de tiempo del feed en los metadatos - Predicciones normalizadas — las actualizaciones de viajes sin procesar se convierten en una forma canónica, ordenadas y agrupadas para tableros de salidas
- Compatible con caché — los endpoints estáticos son de larga duración y cacheables por página; los endpoints en tiempo real son de corta duración y económicos de consultar
- Configuraciones aptas para kioscos — la lectura anónima es un permiso que concedes explícitamente, limitado a los endpoints que las pantallas públicas necesitan
Integración con el sitio que ya operas
Si el sitio principal usa Drupal, la plataforma se instala en él — una base de código, un administrador, un inicio de sesión. Si usa otra cosa, funciona junto a él y aparece donde quieras.
-
Instalación nativa
En un sitio Drupal, la suite es simplemente más módulos: las páginas de rutas y paradas son páginas reales en tu tema, los horarios son contenido y los editores nunca abandonan el administrador que conocen.
-
Integraciones
Los mapas en vivo y tableros llegan como iframes en URLs limpias, con un contrato postMessage para estados ready/empty y orígenes permitidos aplicados vía CSP
frame-ancestors. Detalles en la página de mapas. -
API directa
Omite el iframe y consume el JSON desde tu propio frontend, aplicación o pipeline de datos — los mismos endpoints que consultan las pantallas.
-
Los kioscos son URLs
Una pantalla es una página en una ruta predecible. Cualquier hardware con un navegador puede mostrar una; no hay nada que instalar en el dispositivo.
-
Hooks específicos de agencia
Diseños, libreas, mapeo de IDs y peculiaridades de importación se alojan en un módulo delgado de agencia mediante hooks que publica el núcleo. Cómo se estructura el trabajo personalizado.
Compatible con
Las especificaciones que implementa la suite, las fuentes de feeds con las que ya ha funcionado y el software subyacente.
Pon tu feed a trabajar.
Empieza con los módulos en tu propio sitio Drupal — y cuando prefieras entregar en lugar de alojar, estamos a un email de distancia.