Remplazando la Interfaz Web de XBMC en la XBOX Original
Desde hace mucho tiempo he usado la interfaz web de XBMC, simplemente para reproducir música guardada en el XBOX, ya que explorando esta interfaz en su momento me encontré con secciones rotas, lo que simplemente me llevo a mantener este uso.
Pasado mucho tiempo y habiendo aprendido muchas cosas he vuelto al ecosistema con otros ojos, actualmente uso programas como KDE-Connect, para controlar mi PC a distancia, ademas hace poco tuve la experiencia de instalar el sistema Aurora en una XBOX 360, este programa trae un plugin llamado NOVA, el cual monta una interfaz web que muestra ciertos detalles interesantes de la consola, así como permite controlarla de cierta manera.

Fue gracias a mi experiencia con NOVA que surgió una idea. Siempre me había impresionado la interfaz web de XBMC. En su momento, cuando me encontré con secciones rotas, simplemente las ignoré, ya que no tenía conocimientos de programación ni desarrollo web. Sin embargo, ahora me he propuesto crear una nueva interfaz web, y la idea es documentar todo el proceso en esta serie de artículos.
Seccion a seccion vamos a aproximarnos al sistema, sus caracteristicas, y a mi metodo de trabajo para este proposito. Tenga en cuenta que las siguientes secciones tienen un alto contenido tecnico, y es posible que en algun momento se pierda, sin embargo haré mi mejor esfuerzo para mantener una legibilidad adaptada a un publico no tecnico.
Primeros Pasos
Es importante tener en cuenta el estado actual del ecosistema. Anteriormente, hice un recorrido general de la historia del sistema, sin entrar en demasiados detalles.
Existen diversas versiones de XBMC, así como distintos orígenes, por lo que especificaré las características de mi contexto particular:
- Estoy utilizando la versión de XBMC4XBOX mantenida por Rocky5, obtenida a través de la herramienta Xbox-Softmodding-Tool en su versión 1.2.2 (al momento de escribir este artículo).
- La version de XBMC4XBOX que estoy usando es la
3.6-DEV-r33028, compilada el 18 de agosto de 2017, mediante una instalación limpia. - Mi consola es una XBOX V1.2 con la BIOS
5101 RETAIL - Mi XBOX esta modificado virtualmente (SoftMod), y no hace uso de modificaciones fisicas.
Creería que estas son las características principales que determinan el sistema con el que voy a trabajar.

Habilitando la interfaz Web
Inicialmente XBMC tiene la interfaz deshabilitada, entonces pimero debemos verificar y cambiar las configuraciones de XBMC, para ello debemos navegar por el sistema hasta llegar a las configuraciones de red.

- Allow Control of XBMC via HTTP (Habilitar el control de XBMC via HTTP)
- Allow programs on other systems to control XBMC (Habilitar que programas en otros sistemas controlen XBMC)
Son las 2 opciones que habilitan la API HTTP (Back-end) y la interfaz web (Front-end). En caso de estar habilitadas no es necesario hacer algo, de lo contrario se debe navegar hasta estas opciones y seleccionarlas. ya con esto puede confirmar satisfactoriamente si la interfaz esta disponible usando un navegador web en un dispositivo que comparta la misma red con la XBOX.

Para habilitar estas opciones no es necesario que la consola este conectada a la red, sin embargo para hacer uso de la interfaz es importante que la consola tenga una conexión a una red de internet.
- Primero confirme la IP de su consola en la red local.

Como resultado ahora podemos ver este sitio. Este es el front-end “Reloaded”. En el sistema de archivos de XBMC, se encuentra en la carpeta Q:\web\, para ser precisos este es solo una de las disponibles, y según el blog oficial data mas o menos del año 2013. web oficial

Desconozco si esta opción es definida al momento de compilar la aplicación, aunque entiendo gracias a al Blog que este ‘Front’ es actualmente la opción por defecto, al igual que podriamos decir que fue construido aproximandamente en antes de esa fecha, y que sus estandares pueden estar desactualizados, en referencia a la forma en la que actualmente se programa para la Web.
Podemos hacer una copia cruda de este front-end mediante FTP para tenerlo en nuestro PC y así poderlo estudiar cómodamente, de igual manera podemos acceder al repositorio y poder ver su código fuente así como las otras opciones posibles.
Como lo dije anteriormente esta es solo una opción posible y justamente lo que vamos a hacer es probar las otras opciones, para ello creería que solo hay que remplazar los archivos mediante FTP. Esto lo hacemos con el fin de probar 2 puntos.
- La instalación de Python desde la web.
- Las capacidades de mutación del servidor.
La instalación de Python también se puede probar de otras maneras como por ejemplo intentando ejecutar algún script mediante el explorador de archivos, sin embargo para fines de lo que estoy haciendo también requiero probar Spyce, y pues… para ello se puede hacer un script .spy para probar las 2 cosas.
hay que tener en cuenta que según la web oficial, la version de python instalada es la version 2.7, según mi ignorancia es la ultima version de las versiones 2, ya que actualmente python se encuentra en la versión Python 3.13.2 (main, Feb 5 2025, 08:05:21) [GCC 14.2.1 20250128] on linux (según mi instalación local), esto es importante ya que Python entre las versiones 2 y 3, ha cambiado su sintaxis y algunas funciones core, entonces hay tenerlo muy en cuenta, desde la perspectiva de desarrollo.
El front-end que he escogido para probar SPyce es web/Project_Mayhem_III, sencillamente porque al explorar el codigo fuente este tiene scripts .spy y el punto de entrada web es un archivo .asp es decir que prueba el SSR del servidor GoAHead.
Aquí cabe destacar algo, en el sistema de archivos que XBMC tiene para la carpeta web, hay un archivo llamado umconfig.txt, este es un archivo de configuración que interpreta el servidor GoAHead, técnicamente no debería haber problema si este archivo se elimina, sin embargo para evitar comportamientos diferentes al ya iniciado considero no eliminarlo.
aunque por curiosidad este es el contenido de dicho archivo:
TABLE=users
ROW=0
name=xbmc
password=*****
group=sys_xbox
prot=0
disable=0
TABLE=groups
ROW=0
name=sys_xbox
priv=7
method=2
prot=0
disable=0
TABLE=access
ROW=0
name=/
method=2
secure=0
group=sys_xbox
Una vez hecho el cambio dentro de la carpeta web, podemos recargar la pagina desde el punto de entrada, es decir en la URL del navegador elimine todo después del host, si lo hace correctamente obtenemos lo siguiente:

de lo contrario, verá algo como esto:

- Esta es la pagina 404 del servidor GoAHead.
Ahora vamos a la sección de información de este front-end, el cual es el penúltimo icono de izquierda a derecha en la sección bajó el control multimedia, es decir el icono azul.

Ahora damos click al link System Info, o simplemente va a la siguiente URL: http://<xbox-ip>/scripts/SystemInfo.spy, donde justamente nos encontramos con lo que me temía.

SPyce esta dañado, de igual manera esto tampoco me permite saber si Python esta correctamente Instalado, ya que quien me respondió fue el servidor GoAHead, el “problema” de esto es, que como tal no hay un desarrollador doliente a quien acudir, podría hablar con rocky5 sin embargo el esta centrado en el desarrollo de un fork llamado XBMC4Gamers, donde la interfaz web no esta habilitada.
Acá nacen algunas preguntas importantes, ¿Es SPyce necesario?, ¿Como podría saber cual es el error?, ¿Esto interfiere en el propósito principal de este articulo?…
- Desconozco si SPyce es necesario para el sistema per se, principalmente porque en la documentación, no hay información como tal, simplemente se limita a comentar la compatibilidad con la tecnología PSP.
- Para conocer el error de primera mano pensaría en habilitar las trazas de debug, para esto es necesario realizar algunos procedimientos, que mas adelante detallaré, igualmente afirmo que, el habilitar esto como parte del proceso de desarrollo, para seguir cualquier modificación en el sistema.
- Como tal, no, sin embargo puede que presente limitaciones, por ejemplo para realizar una implementación mucho mas cercana y cómoda a la API HTTP, como lo detalla la documentación.
Entonces en conclusión para este momento, solo sé que el servidor web GoAHead esta funcionando porque el XBOX responde en el navegador, ademas que es capaz de realizar SSR, mediante archivos .asp, y que python puede que funcione pero SPyce, no.
API HTTP
XBMC, ofrece una API, la cual esta documentada en una pagina web tipo wiki, particularmente no estoy muy familiarizado con el formato de esta API, pues en un contexto moderno las interfaces back-end, normalmente funcionan mediante JSON, e incluso la API actual de Kodi implementa el protocolo JSON-RPC, sin embargo esto como tal no es un impedimento, simplemente plantea ciertos retos a la hora de trabajar con esta API, por ejemplo la necesidad de tratar manualmente las respuestas.
En este caso la exploración de esta parte de sistema es mucho mas sencilla basta con hacer la prueba directamente como la especifica la documentación, en su apartado Getting Started, para este contexto seria ir a la siguiente URL en el navegador:
http://<IP-XBOX>/xbmcCmds/xbmcHttp?command=getcurrentlyplaying

Como podemos ver la API es funcional, algo para tener en cuenta, es que la documentación, no es muy explicita a la hora de explicar como gestiona la seguridad.
por ejemplo esto es lo que pasa si intentamos llamar a la API desde un navegador que no se ha registrado.

Como es evidente el sistema usa el método básico de autorización, donde esta seria la respuesta si la autorización fallara.

Ademas el sistema internamente no requiere de esto, es decir, usando ASP, ó SPyce se pueden hacer llamados sin tener que pensar en la cabecera de autorización, sin embargo, si se pretende realizar peticiones directamente desde otros dispositivos cuyo origen es diferente al del XBOX esta cabecera es necesaria.
Tipos de Commandos
Según la documentación, existen varios tipos de commandos. Aquellos que
- Obtienen Información
- Modifican configuraciones
- Generan acciones
- Modifican archivos
- Son commandos varios
- Gestionan el broadcast
Todos los commandos aquí descritos operan bajo peticiones HTTP-GET, esto es algo que se puede ver como contra intuitivo ya que no es común interactuar usando este método HTTP, ya que según los estándares modernos este método es exclusivo para pedir información, sin embargo, según la documentación la API esta diseñada bajo una arquitectura de extracción The HTTP API is a “pull” architecture.
De igual forma el Broadcast que ofrece XBMC, puede ser configurado mediante la API HTTP, sin embargo para acceder a este mecanismo de comunicación, se utiliza el protocolo UDP, enviado a la LAN, usando el HOST 255.255.255.255 al puerto 8278.
Respuestas
La API HTTP, responde documentos html muy sencillos enunciados y separados por la etiqueta <li>.
Ejemplo:
http://<XBOX-IP>/xbmcCmds/xbmcHttp?command=GetSystemInfo(120;121)
-----------------------------------
<html>
<li>3.6-DEV-r33028<li>Aug 18 2017</html>
En este caso la petición tiene una respuesta con varios elementos donde cada elemento es separado por la etiqueta html mencionada.
Solo existe una excepción a este formato y es la función FileDownload() donde la API responde un documento HTML, pero en su interior la respuesta esta en texto crudo (donde el texto representa una codificación en base64).
http://192.168.200.128/xbmcCmds/xbmcHttp?command=FileDownload(G:\Media\Pictures\screenshots\screenshot000.bmp)
<html>
Qk020g8AAAAAADYAAAAoAAAA0AIAAOABAAABABgAAA
</html>
Respuestas de Error
Para el caso de las respuestas de error, estas usan el formato estándar, sin embargo, internamente usan el siguiente formato
Error:REASON
Parámetros
Las funciones de la API, son enviadas mediante el protocolo HTTP, lo que significa que estas peticiones son codificadas como una URL, lo que quiere decir que si estoy haciendo una petición cuyo contenido tenga caracteres especiales como espacios, acentos, o símbolos estos van a tener una forma diferente cuando la petición sea enviada, Ej. para la petición: http://192.168.200.128/xbmcCmds/xbmcHttp?command=GetSystemInfo(120;121), el resultado de la codificación seria: http%3A%2F%2F192.168.200.128%2FxbmcCmds%2FxbmcHttp%3Fcommand%3DGetSystemInfo%28120%3B121%29.
De igual manera las funciones multiparametro usan el carácter ; como separador entre parámetros.
En conclusión la API funciona correctamente, y se puede construir una herramienta que permita usarla, teniendo en cuenta las características acá descritas. Así mismo se puede pensar en el desarrollo de una interfaz en JS vanilla, para la integración de esta API, en una pagina web.
Remplazo de la Interfaz
Según lo visto se puede hacer un remplazo de la interfaz web sencillamente cambiando los archivos en la carpeta correspondiente, y se puede hacer una integración de la API, mediante JS, ya que todo ocurre usando el protocolo HTTP, para el caso del broadcasting, tiene una funcionalidad enfocada a la interacción con otros sistemas, por ejemplo que consola, notifique mensajes o la secuencia de ejecución de commandos internos a otros servicios o maquinas en la red pero mas allá de esto no hay otra utilidad.
Internamente solo me he encontrado con una dificultad, y es que el servidor web, despacha los archivos svg como texto plano, haciendo que el navegador no cargue el recurso adecuadamente.
Por otro lado, en el caso de estar trabajando en el desarrollo de un front-end, es necesario el uso de un servidor proxy para interactuar con API, ya que como la interfaz esta pensada para funcionar con el XBOX como origen, esta no envía la cabecera para gestionar CORS, entonces el navegador va a bloquear las peticiones, pero esto solo pasa cuando se esta trabajando en localhost y usando el XBOX como backend, una vez servida la pagina en el XBOX, este problema desaparece.
Me gustaría modificar el servidor web para el tema de la cabecera de gestión de CORS, pero todavía no comprendo si es posible hacerlo sin tener que compilar nuevamente la aplicación, ya que por el momento quiero evitar tener que hacer eso.
Para el caso SPyce, la investigación procede a habilitar el registro de DEBUG, para ello simplemente se habilita en las configuraciones el logging, aunque, según la documentación, de forma adicional a esto, se puede dar una configuración avanzada mediante un archivo XML en la siguiente ruta Q:\UserData\advancedsettings.xml donde se puede especificar el nivel máximo de logging, lo que es util para ver la información y traza del error.
<advancedsettings>
<loglevel hide="false">3</loglevel>
</advancedsettings>

Para ver reflejados los cambios del archivo advancedsettings.xml, es necesario reiniciar XBMC, una vez hecho esto en la raiz del sistema deberían estar los archivos de log.
Debug
Habiendo habilitado el seguimiento de logs usted se puede encontrar con el siguiente contenido:
18:57:49 M: 56602624 NOTICE: -----------------------------------------------------------------------
18:57:49 M: 56582144 NOTICE: Starting XBMC4Xbox 3.6-DEV-r33028 (SVN:33028, compiler 1310). Built on Aug 18 2017
18:57:49 M: 56582144 NOTICE: special://xbmc/ is mapped to: Q:\
18:57:49 M: 56582144 NOTICE: special://masterprofile/ is mapped to: Q:\UserData
18:57:49 M: 56582144 NOTICE: special://home/ is mapped to: Q:\
18:57:49 M: 56582144 NOTICE: special://temp/ is mapped to: Z:\
18:57:49 M: 56582144 NOTICE: The executable running is: G:\Applications\XBMC4Xbox\default.xbe
18:57:49 M: 56582144 NOTICE: Log File is located: Q:\xbmc.log
18:57:49 M: 56582144 NOTICE: -----------------------------------------------------------------------
así, como dentro de este mismo archivo se puede confirmar las modificaciones hechas usando el archivo XML, anteriormente nombrado.
18:57:52 M: 56365056 NOTICE: Contents of special://profile/advancedsettings.xml are...
<advancedsettings>
<loglevel hide="false">3</loglevel>
</advancedsettings>
18:57:52 M: 56365056 NOTICE: Log level changed to 3
Ahora volveremos a realizar la petición, que anteriormente nos mostraba un error de SPyce.
http://192.168.200.128/scripts/SystemInfo.spy
Volveremos a ver el mismo error, pero viendo las trazas en este archivo, podemos confirmar el funcionamiento de python.
19:06:46 M: 35749888 DEBUG: initializing python engine.
19:06:47 M: 30687232 DEBUG: -->Python Initialized<--
19:06:47 M: 30670848 INFO: Python, unloading python27.dll because no scripts are running anymore
19:06:47 M: 30912512 DEBUG: Q:\system\python\python27.dll (base 1E000000): Detected memory leaks: 239 leaks
Diría que la implementación tiene sus detalles, ya que en el mismo archivo, Python reporta 239 memory leaks, que podrían ser posibles fallos, sin embargo, desconozco totalmente lo que esto representa como tal, puede que sean problemas, como puede que no.
Algo que me parece particular es que no encuentro trazas del intento de ejecución de SPyce, que reflejen el error, así que lo siguiente a realizar es intentar ejecutar Spyce directamente en explorador de archivos.

Como podemos ver algo falla, y si buscamos en archivo de logs podemos ver el error, en este caso python nos dice que el script spyce.py, tiene errores de sintaxis.
19:42:01 M: 29593600 ERROR: Error Type: <type 'exceptions.SyntaxError'>
19:42:01 M: 29593600 ERROR: Error Contents: ('invalid syntax', ('Q:\\system\\python\\spyce\\spyce.py', 418, 44, ' def _startModule(self, name, file=None, as=None, force=0):\n'))
19:42:01 M: 29593600 ERROR: SyntaxError: ('invalid syntax', ('Q:\\system\\python\\spyce\\spyce.py', 418, 44, ' def _startModule(self, name, file=None, as=None, force=0):\n'))
En conclusión esta es la forma de realizar procesos de debug en la instalación de XBMC, lastimosamente la documentación no tiene mucha información acerca de esto, mas allá de lo mostrado en las configuraciones avanzadas, así que de cierta manera queda a criterio personal como interpretar esta información.
igualmente por el momento me quiero limitar a explorar las posibilidades del servidor web estático y de la API HTTP, que son las características que permitieron confirmar que están funcionando adecuadamente, igual no quiero modificar archivos del core, con el fin de evitar la compilación de XBMC, ya que esto representa tener que levantar un entorno de desarrollo, algo que por el momento no tengo planeado.
Si me gustaría intentar arreglar el problema de SPyce, que spoiler: la mayoria son problemas de sintaxis, sin embargo me gustaría abordar esto en un futuro articulo, así como de realizar la pull-request en el repositorio de Rocky5, sin embargo para llegar a ese punto me gustaría primero desarrollar una interfaz web moderna que implemente la API usando JS vanilla, y plantearme como de alguna manera, potenciar la interfaz con SPyce, sin embargo no es bloqueante que esto no funcione.
En la siguiente parte de este viaje, quiero probar el usar frameworks modernos como Astro para crear la interfaz, así como explorar el desarrollo de herramientas que faciliten la actualización del servidor sin tener que realizar acciones manuales con el cliente FTP, también vamos a ver la aproximación a la API, y básicamente todo lo que haga falta hasta lograr tener una interfaz web moderna completamente funcional.
