[En desarrollo] Deco virtual para iOS, iPadOS, tvOS y macOS

Buenas tardes a toda la comunidad,

Primero de todo, agradecer toda la información existente en el foro, gracias a ella, he empezado un nuevo proyecto que estoy seguro que gustará a muchos. No es más que un deco virtual para toda la familia de dispositivos de Apple, añadiendo algunas características como un chat en directo o la posibilidad de votar por tus programas favoritos. (son solo algunas ideas, pero irán viniendo más).

Ahora me encuentro en un problema que me tiene parado, y no es más que la búsqueda de canales. De primeras iba a hacer que el usuario lo configurara de forma manual eligiendo región y paquetes contratados, pero creo que sería interesante poder tener la opción de autobuscar todos los canales disponibles. Buscando por el foro, me topé con este post Obtener LISTA de IP'S de Movistar TV mediante Script Python pero no consigo hacer la versión en Swift y me estoy volviendo loco. Todo el tema de los sockets, etc no hay problema, pero me da ok a todas las ip que pruebo (sean válidas o no) y por tanto no puedo distinguir entre las buenas y malas.
También encontré otros proyectos como por ejemplo movistartv2xmltv que (al parecer) descargan los canales disponibles mediante unas URL de configuración, etc pero tampoco doy con la tecla...

Resumiendo, estoy atascado con este tema de "encontrar" los canales que están disponibles para cada usuario y sus paquetes contratados y os pido ayuda al respecto. Ejemplos, URLs que permitan ver la lista de canales, etc me serían de gran ayuda para continuar.

Gracias y un saludo!
 
Hola @mhergon , ¿cómo va el proyecto? Estaría genial usarlo con dispositivos Apple. Sobre tus dudas podrías consultarlo con @AlphaCentaury que hizo el deco virtual , para ver cómo acceder a los canales disponibles para cada usuario. Me suena que él pensó hacerlo también , pero era más complicado..

Saludos y gracias
 
@cotoways pues hasta que no encuentre la forma de hacerlo solo estoy planteando la interfaz.
He estado mirando los scripts @yonoesio pero no consigo hacerlos funcionar en iOS, los sockets siempre me devuelven que hay algo aunque la IP no sea la correcta.
La única opción que se me ocurre es dejar al usuario seleccionar de forma manual los canales/paquetes que tenga contratado, pero estuve mirando si hay algún sitio donde categorizarlos (el hilo de los canales no me sirve porque difiere en varias cosas).

Tengo hechas varias pruebas, los canales funcionan muy bien, incluso haciendo PiP con muchos streams a la vez, etc.

Resumiendo, estoy un poco parado con esto por culpa de la búsqueda de canales y el tema del EPG que si bien podría obviarlo en la primera versión, sería interesante ponerlo también.

Si pudierais echarme una mano sería genial.
 
Hola. Vayamos por partes.
Nunca he programado en Swift, ni tengo un Mac, por lo que, en cuanto a la programación, no te voy a poder ayudar mucho.

Tanto la lista de demarcaciones (regiones, o en lenguaje DVB, Service Providers) como la lista de canales de cada región se obtienen mediante recepción multicast, utilizando el protocol DVBSTP.

DVBSTP es un protocolo muy ligero para la recepción de archivos. Es básicamente un mecanismo "pasivo". A diferencia de las conexiones normales, en que te conectas activamente a un servidor, con multicast van escuchando los paquetes que emite el servidor multicast.

DVBSTP permite transmitir diferentes archivos (normalmente XML), denominados "payload", que se reciben por fragmentos. En la cabecera se indica el número de fragmento, el total de fragmentos y el identificador del "payload".

La lista de demarcaciones se obtiene de la dirección de multicast 239.0.2.129, puerto 3937. El id del payload es 0x01.

Del archivo XML se extrae la lista de demarcaciones (no vienen identificadas con un nombre), en la que se incluye la dirección de multicast y puerto para recibir la lista de canales (payload 0x02), la lista de paquetes (0x05) y la lista de servidores EPG (0x06).

Los identificadores de paquetes contratados se obtienen mediante una API REST propietaria definida por movistar+. A nivel DVB, un paquete de movistar+ está formado por varios "packages", que, combinados, te dan la lista de todos los canales que se tienen contratados.

Hay otra posibilidad, que es aprovechar parte del código que tengo escrito en .NET, y refactorizarlo para crear una aplicación de terminal de .NET Core 3.1, que sí está disponible para macOS.

.NET Core para aplicaciones de terminal se puede programar usando cualquier editor de texto o un entorno de desarrollo como VS Code (gratis) o Visual Studio for MacOs (de pago, no sé si hay versión de prueba o gratuita).

Si le quieres añadir interfaz de usuario, la solución "oficial" de Microsoft es utilizar Xamarin.Forms, pero requiere Visual Studio for Mac (hasta donde yo sé). Nunca he programado con Xamarin.

Saludos,
Alpha
 
La descripción completa del protocolo DVBSTP está descrita en el especificación técnica (TS) de la ETSI (European Telecommunications Standards Institute) número 102 034 ("Transport of MPEG-2 TS Based DVB Services over IP Based Networks"), capítulo 5 (Service discovery), sección 5.4 (Transport mechanisms), apartado 5.4.1 (Protocol for multicast delivery of SD&S information).

La última versión está disponible en https://www.etsi.org/deliver/etsi_ts/102000_102099/102034/02.01.01_60/ts_102034v020101p.pdf
 
Con respecto al código .NET, es open source y está disponible en mi GitHub: https://github.com/AlphaCentaury/MovistarTV

La implementación del cliente del protocolo DVBSTP se encuentra en la librería DvbStpClient (ubicada en 1.5 'Kruger 60'\Assemblies\DvbStpClient).

Las clases relevantes son:
  • DvbStpBaseClient Implementación base del cliente
  • DvbStpSimpleClient Cliente para descargar un payload concreto, mediante el método GetPayload().
  • DvbStpEnhancedClient Cliente para descargar varios payloads de forma simultánea, mediante el método DownloadPayloads().

Para procesar los diferentes archivos XML resultantes de los payloads, en la librería Etsi.Ts102034 (ubicada en 1.5 'Kruger 60'\Assemblies\Etsi.Ts102034) están definidas clases para facilitar la deserialización del XML.

Las más relevantes son (en el espacio de nombres Etsi.Ts102034.v010501.XmlSerialization):
  • ProviderDiscoveryRoot (lista de demarcaciones)
  • PackageDiscoveryRoot (lista de paquetes)
  • BroadcastDiscoveryRoot (lista de canales)
  • BroadcastContentGuideDiscoveryRoot (lista de servidores EPG)
Detalles adicionales sobre la información en los XML:
  • En la lista de canales (payload 0x02: services) no vienen los números de canal, solo el nombre y la dirección multicast (RTP).
  • Los números de canal se especifican en los paquetes (0x05), haciendo referencia al canal, pero de forma indirecta, mediante el service ID.
  • En mi programa, para asignar número a la lista de todos los canales (contratados o no, emitan o no), se pone como número el que más veces aparece en los paquetes. Así, por ejemplo, si TVE1 HD aparece en 15 paquetes como '001' y en 5 como '801', se le asigna el número '001'.
 
Arriba