Índice
- Introducción
- Manual de Uso
- Metodología
- Descripción técnica
- Diseño
- Implementación
- Test
- Tiempo de trabajo
- Conclusiones
Este proyecto, desarrollado por Yelko Veiga Quintas, parte del curso de 1º de Programación en DAM a propuesta de David Gelpi @dfleta.
La finalidad es desarrollar un software capaz de generar una lista de reproducción de canciones de manera aleatoria y activar la reproducción a través de VLC.
No se empleará base de datos, sino que en su lugar el acceso a datos se llevará a cabo mediante un archivo .xspf. En esta solución en particular, se dispondrá de un directorio en el que cualquier usuario pueda depositar su archivo .xspf para que sea incluido y reproducido en VLC.
Se ha utilizado como lenguaje de programación Python (versión 3.11.5) para la lógica de la aplicación.
GitPython3pip3VLC
-
Instalar Python.
Descargamos e instalamos Python desde python.org. Nos aseguramos de marcar la opción "Add Python to PATH" durante la instalación.
-
Clonar el proyecto desde Git.
Desde un terminal (cdm o powershell, por ejemplo), nos situamos en el directorio donde vamos a clonar nuestro proyecto y ejecutamos:
$ git clone https://github.com/yelkov/retoVLC.gitEsto clonará el proyecto en tu directorio actual.
-
Crear y activar un entorno virtual.
Primero nos colocamos en el directorio recién creado. A continuación creamos y activamos un entorno virtual:
$ cd retoVLC $ python -m venv venv $ .\venv\Scripts\activateEsto creará un entorno virtual y lo activará.
-
Instalar las dependencias:
$ pip install -r requirements.txt -
En caso de no tener instalado el reproductor VLC en el equipo, podemos descargar el setup de la página de VLC y ejecutarlo, manteniendo la instalación por defecto.
El programa va a buscar el ejecutable de VLC en la ruta C:\Program Files (x86)\VideoLAN\VLC\vlc.exe o en su defecto en C:\Program Files\VideoLAN\VLC\vlc.exe . Si este no se encuentra instalado en alguna de esas rutas se enviará un mensaje de error.
-
Después de ejecutar el programa, si queremos desactivar el entorno virtual:
$ deactivate
-
Instalar Python.
En la mayoría de las distribuciones de Linux, Python ya está instalado. Si no lo está, lo instalamos a través del gestor de paquetes de nuestra distribución en particular.
-
Clonar el proyecto desde Git.
Desde un terminal:
$ git clone https://github.com/yelkov/retoVLC.git -
Crear y activar un entorno virtual.
Primero nos colocamos en el directorio recién creado. A continuación creamos y activamos un entorno virtual:
$ cd retoVLC python3 -m venv venv source venv/bin/activate -
Instalar las dependencias.
$ pip install -r requirements.txt -
En caso de no tener instalado el reproductor VLC en el equipo:
$ sudo apt install vlcEl programa va a buscar el ejecutable de VLC en la ruta /usr/bin/vlc o en su defecto en /snap/bin/vlc . Si este no se encuentra instalado en alguna de esas rutas se enviará un mensaje de error.
-
Después de ejecutar el programa, si queremos desactivar el entorno virtual:
$ deactivate
Podemos reproducir una de las listas creadas en el directorio lista_canciones o bien depositar nuestra lista de canciones en formato .xspf en ese directorio en particular para ser reproducida.
Por defecto tendremos dos listas válidas para reproducir, que son 'creedence.xspf' y 'lista_prueba.xspf'. Las canciones de estas dos listas se encuentran en el subdirectorio canciones (lista_canciones/canciones). Si el usuario quiere ejecutar su propia lista no necesita añadir las canciones a este subdirectorio, siempre que la ruta a las canciones se encuentre en el propio equipo y que el archivo .xspf se encuentre en un formato válido.
El programa siempre va a exigir el nombre de la lista a reproducir. En caso de error en la escritura,error de formato del archivo o falta del nombre de la lista, se le indicará al usuario cual es el error para que pueda subsanarlo.
-
Abrimos un terminal.
- Windows:
$ app.py creedence.xspf- Linux:
$ python3 app.py creedence.xspf
Debemos aseguramos de estar situados en el directorio raíz (retoVLC). Si el usuario quiere introducir su propia lista, cambiamos 'creedence.xspf' por el nombre de la lista deseada (incluida la extensión .xspf)
-
Para detener la reproducción, cerramos VLC.
En caso de querer reproducir de nuevo una lista, repetimos el proceso anterior desde el terminal.
Este proyecto sigue una metodología de desarrollo incremental basada en ramas que facilita la gestión de versiones y la colaboración entre desarrolladores. A continuación, se detalla el flujo de trabajo.
-
main: La rama main representa la versión estable y lista para producción del proyecto. Cada versión estable se etiqueta con un número de versión. Actualmente, la primera y última versión estable es la 1.0.0. -
develop: La rama develop es la rama principal de desarrollo. Todas las nuevas características y desarrollos se realizan en esta rama. Es importante destacar que esta rama nunca debe considerarse como una versión estable del proyecto.
-
Nueva Funcionalidad: Cuando se trabaja en una nueva funcionalidad o característica, se hace en la rama
develop. -
Desarrollo y Commits: Realizamos los cambios y commits en esta misma rama. Siempre tratamos de hacer commits pequeños, descriptivos y utilizando el sistema de Conventional Commits.
git add . git commit -m "tipo(alcance): añadir XYZ" -
Pruebas Locales: Realizamos pruebas locales para asegurarnos de que la nueva funcionalidad funciona como se espera. Para ello utilizamos el marco de pruebas para python Pytest.
-
Merge con
main: Una vez que la funcionalidad está completa y probada, realizamos un merge con la ramadevelop.git checkout main git merge --no-ff develop -
Resolución de Conflictos (si es necesario): Si hubiese conflictos durante el merge, los resolvemos manualmente y realizamos un commit adicional.
-
Push a
develop: Subimos los cambios a la rama develop en el repositorio remoto.git push origin develop -
Release: Una vez realizado el merge en
main, ya sea una nueva funcionalidad o un patch de errores, podemos añadir una nueva etiqueta a esta rama que indique la versión en la que nos encontramos.$ git tag -a x.y.z -m "Versión x.y.z"Con -a creamos la etiqueta 'x.y.z' (sustituyendo por los números que correspondan) y asociamos un mensaje.
Finalmente subimos la etiqueta al repositorio remoto:
$ git push origin 1.0.0
Se utiliza esta estrategia para gestionar errores previsibles en la entrada de datos y aumentar robustez del código así como validaciones en puntos críticos que eviten la propagación de defectos no esperados. Se implementa a través del manejo de excepciones y programación por contrato.
-
Manejo de excepciones : se aplica tanto en el módulo
parsear_xspf(ET.ParseError y FileNotFoundError) como enllamar_vlc(FileNotFoundError), para detectar y gestionar errores como archivos corrompidos que no se puedan parsear, archivos no encontrados o bien ruta no encontrada para vlc. -
Programación por contrato : se implementa en los módulos
validar_lista_localizacionesyrandomizar_lista. En este sentido, la programación defensiva se aplica mediante la verificación de tipos en las precondiciones (que sea una lista) y validación de contenido en las postcondiciones (mantener el input como invariante y tipo de los datos de salida).
-
Capa de servicio
- app.py - programa principal.
-
Capa de negocio
-
llamar_vlc.py: ejecuta VLC con una lista de reproducción dada según el sistema operativo, validando la existencia del ejecutable de VLC.
-
randomizar_lista.py : toma una lista como entrada, reordena sus elementos de manera aleatoria y la devuelve.
-
validar_lista.py : verifica si la lista de localizaciones de canciones contiene cadenas no vacías y devuelve la lista validada.
-
-
Capa de acceso a datos
- parsear_xspf.py : lee un archivo XSPF, parsea sus elementos XML y devuelve una lista de localizaciones de canciones.
Lee un archivo XSPF y lo parsea utilizando xml.etree.ElementTree, extrayendo las localizaciones de canciones y devolviendo una lista. Maneja errores como archivos vacíos (o que no se pueden parsear) o archivos no encontrados.
Asegura que una lista de localizaciones sea válida, comprobando que sea una lista de cadenas no vacías, y la devuelve si cumple con las condiciones de validación.
Duplica y reordena aleatoriamente los elementos de una lista, validando que todos los elementos originales estén presentes en la lista reordenada.
Ejecuta VLC con una lista de reproducción, considerando el sistema operativo y validando la existencia del ejecutable de VLC en rutas predefinidas.
-
xml.etree.ElementTree: Librería que permite parsear y manipular archivos XML, utilizado aquí para extraer información de un archivo XSPF.os: Librería que proporciona funciones para interactuar con el sistema operativo, usado para gestionar rutas y directorios en el proyecto.sys: Librería utilizada para manejar la salida del sistema, especialmente para salir del programa con códigos de estado.platform: Librería con la que se determina el sistema operativo actual, permitiendo adaptar el comportamiento del código según la plataforma.random: Librería utilizada para reordenar aleatoriamente los elementos de una lista, en este caso, para randomizar la lista de reproducción de canciones.subprocess: Librería que facilita la ejecución de comandos del sistema operativo, aquí usado para llamar a VLC y reproducir la lista de reproducción generada.pytest: Framework utilizado para escribir casos testcoverage: Herramienta para medir el código de un programa cubierto por los test.pip: administrador de paquetes en Python que simplifica la instalación, actualización y gestión de bibliotecas y paquetes. -
Miniconda3 : es una distribución minimalista de Conda, un sistema de gestión de paquetes y entornos para Python, facilitando la administración y distribución de paquetes.
-
Git : sistema de control de versiones distribuido, permite gestionar cambios en el código colaborativamente, rastreando historial y ramificaciones.
-
Markdown : lenguaje de marcado ligero para formatear texto de manera simple y legible, ampliamente utilizado en documentación.
Los test realizados se pueden encontrar en la carpeta test.
En el proyecto se utilizan dos tipos de test:
-
Unitarios : Evalúa un módulo particular de código para verificar su comportamiento y funcionamiento esperado.
-
test_parsear_xspf.py : El código contiene
6 testsque verifican la funcionalidad de obtener_localizaciones para archivos XSPF específicos, incluyendo casos de archivos vacíos o inexistentes. -
test_validar_localizaciones.py : cuenta con
2 test, uno en el que se prueba la salida con archivos erróneos y otro con archivos válidos. -
test_randomizar_lista.py : El código tiene
5 testsque verifican la funcionalidad de randomizar_lista para diferentes casos, incluyendo listas vacías, conservación de elementos y longitud de los mismos.
-
-
Integración : Son test para evaluar la interacción entre múltiples componentes o módulos del software, asegurando su colaboración adecuada.
-
test_integracion_validador.py :
2 testsde integración que evalúan la funcionalidad combinada de obtener_localizaciones y validar_lista_localizaciones. Verifican la validación exitosa y el manejo adecuado de archivos incorrectos o vacíos. -
test_integracion_random.py :
3 testsde integración que evalúan las funciones combinadas validar_lista_localizaciones, obtener_localizaciones y randomizar_lista. Verifican longitudes y contenidos, asegurando la diversidad y validez de las listas resultantes.
-
El módulo que llama a VLC no es posible testearlo con código, ya que la comprobación del proceso es la propia ejecución de VLC.
Teniendo en cuenta lo anterior, podemos ver que los test planteados cubren un 100% de nuestro código (hay que tener en cuenta la exclusión del módulo 'llamar_vlc.py'.)
Utilizamos Clockify, una herramienta de seguimiento de tiempo en línea que ayuda a registrar, analizar y gestionar eficientemente el tiempo dedicado a tareas y proyectos.
El tiempo total empleado es aproximadamente de unas 15 horas
La distribución de tiempo entre las distintas partes del proyecto es la que sigue:

Consideramos que a pesar de que el problema a resolver es relativamente sencillo, el hecho de hacer un trabajo de estas características por primera vez supone un reto del que se ha conseguido sacar mucho provecho de cara al aprendizaje.
Durante la construcción de los diferentes módulos, su testeo e integración posterior, hemos podido asimilar la razón de aplicar ciertas estructuras y metodologías de trabajo que permiten mantener el desarollo controlado. Han surgido ciertos errores durante la realización del proyecto que sin estas herramientas hubiesen sido más difíciles de identificar y corregir.
Como conlusión final, independientemente del resultado de la calificación de este reto, resulta motivador comprobar el avance de estos últimos meses en el desarrollo de un software ejecutable y aplicar los conocimientos obtenidos.
- Leer varias listas de canciones e integrarlas en una sola al ejecutar VLC (es decir, pasar como argumento más de una lista de canciones).
- Posibilidad de que el usuario no necesite guardar un archivo xspf extraído previamente, sino que este se genere a partir de una serie de canciones elegidas por él.
El enfrentarse por primera vez a muchas de las herramientas y metodologías empleadas (Git, programación defensiva), así como sobre todo el trabajo previo de pensar en la estructura y diseño del proyecto han supuesto los mayores desafíos.
Aunque no se ha reflejado en el tiempo final de trabajo, una parte importante de este fue destinado al uso de Git como herramienta de control de versiones para tratar de mantener un flujo de desarrollo lo más legible posible.
Los módulos en los que más tiempo se ha empleado son parsear_xspf y validar_localizaciones:
- En el primer caso la dificultad se encontraba en la manera acceder a los datos necesarios para desarrollar el proyecto, cómo introducir el archivo requerido como argumento indicando la ruta adecuada y como manejar los posibles errores que pueden surgir de la lectura de ese archivo.
- Por otro lado, el desarollo de este módulo surge de la idea de crear una barricada de saneamiento para la entrada de datos, si bien más tarde se optó por gestionar los errores de lectura en el módulo de parsear. Este segundo módulo se utilizó entonces para comprobar la validez de los datos extraidos en el módulo anterior, y es posible que en posteriores desarrollos se pudiese ampliar este mismo para una mejor obtención de datos válidos.
Otra de las dificultades se encontró en la creación de los test, a pesar de que tampoco se refleja de todo en los esquemas de tiempo. La mayor dificultad ha sido el testeo de los casos en los que intervienen las excepciones, comprendender la sintaxis para que pytest detecte que esa excepción está gestionada. Además hay algunas partes del trabajo que podrían estar mejor testeadas, en particular no se encontró una solución óptima al testeo del módulo que ejecuta VLC. Se pudo probar la validez del programa para Windows y para Linux, si bien para sistemas operativos de Apple no tenemos ningún tipo de feedback.
Por último, la cuestión de las dependencias del proyecto es la que más dudas nos genera una vez entregado este, y es un tema en el que necesariamente tendremos que indagar y mejorar a futuro.

