Saltar a contenido

Bienvenido a la documentacion de Blosteflix

Blosteflix es un proyecto de desarrollo de una app al estilo Netflix. Esta formado por varios componentes cada uno con su responsabilidad, entre ellos tenemos:

  • Repoductor video, hecho en Flutter
  • Un gestor de los videos subidos a la plataforma, hecho en Vue
  • Un servidor API REST que muestra el catálogo, hecho en Spring
  • Un servidor de contenido HLS, hecho en hls
  • Y a futuro una pasarela de pagos administrada mediante Odoo.

Diagrama C4

C4Context title Diagrama C4 – Nivel 1 (Contexto) – blosteflix Person(usuario, "👤 Usuario", "Consume contenido en streaming") Person(admin, "🛠️ Administrador", "Gestiona vídeos, catálogo y usuarios") System(blosteflix, "🎬 blosteflix", "Plataforma de streaming de vídeo bajo demanda") System_Ext(videoServer, "📹 Servidor de Vídeo", "Almacena y sirve contenido multimedia (HLS)") System_Ext(catalogo, "📚 Servidor de Catálogo (Spring Boot)", "Gestiona metadatos de películas y series") System_Ext(pagos, "💳 Pasarela de Pagos (Odoo)", "Gestión de pagos y suscripciones") Rel(usuario, blosteflix, "Reproduce vídeos, gestiona su suscripción") Rel(admin, blosteflix, "Administra vídeos y catálogo") Rel(blosteflix, videoServer, "Solicita playlists y segmentos HLS") Rel(blosteflix, catalogo, "Consulta y gestiona metadatos") Rel(blosteflix, pagos, "Gestiona pagos y suscripciones")
C4Container title Diagrama C4 – Nivel 2 (Contenedores) – blosteflix Person(usuario, "👤 Usuario", "Consume contenido en streaming") Person(admin, "🛠️ Administrador", "Gestiona vídeos, catálogo y usuarios") System_Boundary(blosteflix, "🎬 blosteflix") { Container(appClient, "📱 App Cliente", "Web / App móvil", "Reproducción de vídeo y navegación del catálogo") Container(appAdmin, "🧑‍💼 App Administrador", "Aplicación web", "Gestión de vídeos, usuarios y catálogo") Container(catalogoApi, "📚 Servidor de Catálogo", "API Spring Boot", "Gestión de metadatos de películas y series") Container(mediaServer, "📹 Media Server", "Node.js + Express", "Almacenamiento y streaming HLS") } System_Ext(pagos, "💳 Pasarela de Pagos", "Odoo", "Gestión de pagos y suscripciones") ContainerDb(catalogoDb, "🗄️ BD Catálogo", "PostgreSQL", "Metadatos del contenido") ContainerDb(mediaDb, "🗄️ BD Media", "Sistema de ficheros / BD", "Vídeos y segmentos HLS") ContainerDb(pagosDb, "🗄️ BD Pagos", "PostgreSQL", "Pagos y suscripciones") Rel(usuario, appClient, "Utiliza") Rel(admin, appAdmin, "Utiliza") Rel(appClient, catalogoApi, "Consulta catálogo (REST)") Rel(appClient, mediaServer, "Reproduce vídeo (HLS)") Rel(appAdmin, catalogoApi, "Gestiona metadatos (REST)") Rel(appAdmin, mediaServer, "Sube vídeos") Rel(catalogoApi, catalogoDb, "Lee / Escribe") Rel(mediaServer, mediaDb, "Almacena contenido") Rel(appClient, pagos, "Gestiona suscripción") Rel(appAdmin, pagos, "Gestión administrativa") Rel(pagos, pagosDb, "Persistencia")
C4Component title Diagrama C4 – Nivel 3 – Componentes del Servidor de Catálogo Container(catalogoApi, "📚 Servidor de Catálogo", "Spring Boot", "Gestión de metadatos del contenido") Component(controller, "🎮 Controllers REST", "Spring MVC", "Exponen endpoints del catálogo") Component(service, "🧠 Servicios de Dominio", "Spring Service", "Lógica de negocio del catálogo") Component(repository, "🗄️ Repositorios", "Spring Data JPA", "Acceso a datos") Component(search, "🔍 Motor de Búsqueda", "JPA / Queries", "Búsqueda y filtrado de contenidos") ContainerDb(db, "🗄️ BD Catálogo", "PostgreSQL", "Metadatos") Rel(controller, service, "Llama") Rel(service, repository, "Usa") Rel(service, search, "Consulta") Rel(repository, db, "Lee / Escribe") Rel_U(catalogoApi, controller, "HTTP REST")
C4Component title Diagrama C4 – Nivel 3 – Componentes del Media Server Container(mediaServer, "📹 Media Server", "Node.js + Express", "Gestión y streaming de vídeo HLS") Component(upload, "⬆️ Upload Controller", "Express Route", "Recepción de archivos de vídeo") Component(metadata, "📊 Metadata Extractor", "FFmpeg", "Extracción de metadatos técnicos") Component(hls, "📦 HLS Processor", "FFmpeg", "Segmentación y generación HLS") Component(stream, "▶️ Streaming Controller", "Express Route", "Entrega de playlists y segmentos") Component(storage, "💾 Storage Manager", "Filesystem", "Gestión de archivos de vídeo") ContainerDb(fs, "🗄️ Almacenamiento", "Filesystem", "Vídeos originales y HLS") Rel(upload, metadata, "Extrae metadatos") Rel(upload, storage, "Guarda vídeo original") Rel(metadata, hls, "Inicia procesamiento") Rel(hls, storage, "Genera segmentos HLS") Rel(stream, storage, "Lee playlists y segmentos") Rel(storage, fs, "Persiste archivos") Rel_U(mediaServer, upload, "HTTP POST") Rel_U(mediaServer, stream, "HTTP GET (HLS)")

Requisitos funcionales y no funcionales

Requisitos funcionales

Funciones específicas

  • Se debe permitir a los usuarios registrarse con username y contraseña.
  • Se debe permitir a todos los usuarios registrados ver el catálogo.

  • Se debe subir el video a la base de datos cuando se confirma y estar disponible en el catálogo.

  • Se debe restringir que solo los administradores den de alta a nuevos administradores.
  • Se debe restingir que solo los usuarios accedan a la app reproductor y catálogo y que solo los administradores accedan a la app de administrador
  • Los permisos de los administradores se dividen en roles, permiso de videos y permiso de usuarios.

  • Se debe validar la subscripción del usuario con cada interacción relacionada con reproducir video.

  • Se debe cambiar el estado de la subscripción del usuario cuando haga una modificación en su subscripción.
  • Se debe permitir el pago con targeta.

Reglas de negocio

  • Al clicar en una portada del catálogo que debe llevar una página con el video con los detalles del video.
  • Al clicar en el play de un video debe mostrar las opciones, pantalla completa, parar el video, barra de duración.
  • El titulo de la barra de navegación debe mostrar el catálogo.
  • El botón categorías debe abrir un desplegable con todos los tipos de video y al clicar en uno mostrarte un catálogo con solo los videos que contengan esa categoría.
  • Al hacer clic en buscar debe aparecer una barra buscadora que busque por título o por fragmento de título.

Requisitos no funcionales

  • Rendimiento, que cargue el video en menos de 5 segundos.
  • Escalabilidad, el código y la base de datos puedan crecer al ritmo de la aplicación de manera fácil.
  • Seguridad Básica, que todo el tráfico sea a través del protocolo HTTPS, que las contraseñas encriptadas en la base de datos y un sistema de login seguro con tokens que expiran.
  • Compatibilidad, que sea compatible en diferentes navegadores y SO de móviles.