Giter VIP home page Giter VIP logo

movistar-u7d's Introduction

Movistar IPTV U7D - Flussonic catchup proxy

TiviMate Movistar

Qué es

  • Software para acceder a la red IPTV de televisión digital que Movistar ofrece con sus instalaciones de fibra, tanto directos como el archivo de 7 días, con cualquier cliente IPTV con soporte de catchup flussonic, tal como ofrecen Android, Android TV, iOS y casi todas las SmartTV.

  • Así mismo da acceso a las grabaciones que tengamos en la nube de Movistar.

  • Por último, ofrece un sistema de grabaciones locales automáticas, o temporizadores, muy útiles para archivar programas o series emitidos.

Movistar cuenta con la plataforma de IPTV más potente e interesante de todo el mercado, se adhiere en general a estándares, lo que significa que funciona de una forma abierta. Si bien hoy toda la oferta de TV de pago de Movistar se transmite encriptada, los canales de TDT (con alguna excepción puntual) siguen siendo en abierto.

Por tanto, con sólo tener contratada la fibra de Movistar con acceso a la TDT, sin necesidad de ningún paquete de televisión, junto con este software, se tiene acceso a toda la parrilla de la TDT, con un archivo de 7 días, de una forma completamente diferente, donde el usuario tiene el control absoluto del contenido que ve o no ve con una comodidad inusual.

La perfección se consigue con una NVIDIA Shield o algún SmartTV con Android TV de gama alta, como puede tener SONY, aunque en algo bastante más barato como el Xiaomi Mi Box S también se puede usar bastante bien.

Uso

Ofrece compatibilidad completa con:

  1. En Android TV: TiviMate.

  2. En Android: OTT Navigator IPTV

  3. Multiplataforma: Kodi con IPTV Simple PVR

Una vez instalado, tendremos las siguientes URLs disponibles, donde 192.168.1.10 sería la IP donde está funcionando el proxy:

  1. Canales: http://192.168.1.10:8888/MovistarTV.m3u http://192.168.1.10:8888/Canales.m3u o http://192.168.1.10:8888/Channels.m3u

  2. Guía de programación (EPG): http://192.168.1.10:8888/guide.xml.gz http://192.168.1.10:8888/guia.xml.gz http://192.168.1.10:8888/guide.xml o http://192.168.1.10:8888/guia.xml

Con estas dos ya tendremos acceso a los directos y a los últimos 7 días en cualquier cliente IPTV con soporte de catchup flussonic. De hecho, con configurar la primera suele ser suficiente, ya que la guía la saca de la propia lista de canales, que incluye un enlace a la misma.

catchup1 catchup2

También es posible acceder a las grabaciones que tengamos en la nube de Movistar. De tener alguna grabación en dicha nube, tendremos disponibles una nueva lista de canales y una nueva guía de programación que, análoga a la general, incluirá solamente información de aquellos programas que tengamos grabados. El resultado es una forma muy cómoda de acceder a estas grabaciones en la nube.

  1. Canales con grabaciones en la nube de Movistar: http://192.168.1.10:8888/MovistarTVCloud.m3u, http://192.168.1.10:8888/Cloud.m3u o http://192.168.1.10:8888/Nube.m3u

  2. Guía de programación de las grabaciones en la nube (EPG): http://192.168.1.10:8888/cloud.xml o http://192.168.1.10:8888/nube.xml

cloud1 cloud2

Por último, dispone de una funcionalidad de grabaciones locales automáticas, o temporizadores, y acceso a las mismas a través de una nueva lista de canales .m3u de tipo VOD, que resulta especialmente útil para almacenar de forma local programas y series, y así crear colecciones. El resultado es increíblemente cómodo de usar.

  1. Lista VOD de Grabaciones Locales: http://192.168.1.10:8888/Recordings.m3u o http://192.168.1.10:8888/Grabaciones.m3u

Ésta última sólo se activará cuando la variable de entorno RECORDINGS esté definida.

recordings

overview settings

  1. Si tenemos además activa la opción RECORDINGS_PER_CHANNEL, en los canales de los que tengamos grabaciones realizadas, se generará una lista m3u por cada uno. Ésta será ligeramente diferente de las anteriores, más pensada para consumir con reproductores como vlc o mpv. Las encontraremos en la carpeta correspondiente a cada canal y podremos acceder a ellas con el nombre del canal sin espacios, el hd no es necesario: http://192.168.1.10:8888/neox.m3u o http://192.168.1.10:8888/la2.m3u

En todos los casos, las URL de las listas m3u son insensibles a mayúsculas o minúsculas.

  1. Métricas de utilización para Prometheus: http://192.168.1.10:8888/metrics

Éstas contienen información en tiempo real de los clientes activos, separados por directos y catchups, y ordenados por la latencia inicial que tuvo cada stream para llegar. Perfectas para conectar con Grafana y así poder visualizarlas y también tener un archivo histórico de uso:

grafana-dashboard.json

Instalación en Windows

Nos descargamos la última versión de aquí, la descomprimimos donde nos resulte más cómodo y del interior de la carpeta movistar-u7d, ejecutamos mu7d.exe.

Enseguida se abrirá una ventana de un terminal, donde aparecerán mensajes de información sobre todo lo que está haciendo.

movistar-u7d-inicio

Por defecto la(s) lista(s) de canales y la(s) guía(s) las generará en vuestra carpeta de usuario, que o bien podemos abrir directamente, o podemos acceder a través de las URLs normales. Podemos usar VLC o mpv por ejemplo, que aunque no soportan en sí el catchup, es decir, no hay forma de seleccionar de forma cómoda programas de la parrilla, sí pueden reproducir todo. Mucho más completo resulta Kodi con IPTV Simple para usar en el ordenador.

movistar-u8d-escritorio

Existen varias opciones de configuración.

Instalación en Linux/UNIX/OS X

Podemos usar cualquier tipo de dispositivo, desde un ordenador tradicional a algo más sencillo como una raspberry, con Linux/UNIX/OS X como OS y conectado directamente al router (o con igmpproxy en el router). Un poco más abajo podéis ver las variables de entorno que se pueden ajustar para configurar el proxy, como activar las grabaciones, el control de ancho de banda automático, etc.

  1. Tenemos la opción de utilizar docker y docker-compose.
docker-compose up -d && docker-compose logs -f

Dentro del docker queda todo lo necesario y se ejecutará muy rápidamente, sólo tiene que descargar la última versión disponible aquí, no necesita generar nada. Un vez arranque sí, tardará unos minutos en generar la EPG y las listas de canales.

  1. Si por el contrario preferimos instalarlo y usarlo directamente:
  • Necesitamos los paquetes git, libffi-dev y python3-pip instalados con el gestor de paquetes de nuestra distro. Necesitamos por lo menos Python 3.7 A continuación instalamos las dependencias:
pip3 install -r requirements.txt
chmod +x mu7d.py movistar_u7d.py movistar_epg.py movistar_vod.py movistar_tvg.py
cp mu7d.py movistar_u7d.py movistar_epg.py movistar_vod.py movistar_tvg.py /usr/local/bin/
  • Para hacer grabaciones también necesitamos tener instalados tanto ffmpeg como mkvtoolnix.
  1. Para Systemd:
  • Copiamos mu7d.service a /etc/systemd/system, lo habilitamos y lo iniciamos:
cp mu7d.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable mu7d
systemctl start mu7d

Sin systemd, podemos ejecutar directamente mu7d.py

Configuración

  • La primera vez tendremos que esperar a que se genere la lista de canales y a que se descargue la guía. Sin playlist no hay canales y sin EPG no hay catchup. Tardará un buen rato.

  • Podemos controlar varios aspectos ajustando el fichero de configuración mu7d.conf que deberemos copiar al directorio /etc o al $HOME, en UNIX, o a nuestra carpetal personal en Windows.

    1. La más importante es LAN_IP, que corresponde a la ip que tendrán los canales de tv. Por defecto usa la ip local principal.

    2. DEBUG: para ejecutar el proxy con mucha información extra. Útil para depurar problemas, ver los canales encriptados que recibimos pero no son indexados, etc.

    3. EXTRA_CHANNELS: canales adicionales a los que queremos acceder. Si la lista de canales no existe, bien porque ejecutamos el proxy por primera vez o porque la borramos antes de ejecutarlo, podremos ver la lista de canales encriptados que se saltan. Los podemos añadir, separados por espacios, a esta variable. Por ejemplo 4917 o 5066 para La 1 HD en Madrid y en Galicia respectivamente, ambos encriptados.

    4. IPTV_BW_SOFT & IPTV_BW_HARD: límites de ancho de banda máximo que le perimitimos usar al proxy. Útil si se instala en el propio router, donde puede conocer el ancho de banda usado por la vlan de IPTV, o en un aparato independiente. Los valores máximos son de 90000/100000 Kbps. Esto consigue que no se produzcan cortes por saturación de la vlan de IPTV y se puedan hacer grabaciones en paralelo aprovechando todo el ancho de banda.

    5. MP4_OUTPUT: por defecto las grabaciones se harán en .mkv, conservando todas las pistas originales, con el audio mp2 transcodeado a aac para que se puedan reproducir directamente con un navegador. Los subtítulos pueden dar incompatibilidad con algunos clientes, por lo que con esta variables definida obtendremos en su lugar un archivo .mp4 sin subtítulos y un .sub adicional con los mismos si existen.

    6. NO_SUBS: si no queremos grabar subtítulos, tanto si es de forma general como para subsanar un problema puntual con un canal/programa que no se deja grabar. Hay 3 canales que emiten siempre con subtítulos de teletexto y estos resultan problemáticos a la hora de grabarse por lo que son descartados pero desconozco si hay más emisiones puntuales que los usan, para eso esta opción.

    7. RECORDINGS: define la ruta para las grabaciones. Si se define, permite usar la funcionalidad de temporizadores y hace que se exporte la lista de grabaciones locales. Las grabaciones se realizarán aquí y la lista de canales VOD se generará con todo el contenido desde aquí indexado. Esto quiere decir que puede ser útil para exponer una carpeta aunque no utilicemos los temporizadores.

    8. RECORDINGS_PER_CHANNEL: realizar las grabaciones organizadas en subdirectorios por canal. También activará la generación de un m3u en cada directorio de canal, con las grabaciones ordenadas de más antiguas a más nuevas.

    9. RECORDINGS_THREADS: número máximo de grabaciones locales simultáneas, por defecto 4. Si se establece IPTV_BW las grabaciones máximas también serán ajustadas dinámicamente. Si probáis un temporizador con algo que se repita mucho toda la semana, algo como Los Simpson, con la variable IPTV_BW definida con valor 85000, veréis como se lanzan en paralelo un montón de procesos vod.py y ffmpeg, un par por cada grabación. Podrás comprobar luego como todas las grabaciones están perfectas.

    10. TVG_THREADS: número de descargas paralelas al generar la EPG. Por defecto usa tantos hilos como CPUs detecta en el sistema, con un máximo de 8.

    11. U7D_THREADS: número de procesos simultáneos para el microservicio principal, por defecto 4.

    12. Para el resto, que es inusual necesitar cambiarlas, mirad directamente el fichero mu7d.conf.

  • Si queremos hacer grabaciones, además de activar la opción RECORDINGS en el fichero anterior, también tendremos que copiar timers.conf, ajustado a nuestro gusto, a nuestra carpeta de usuario.

Configuración de clientes

  • Bastará con añadir la, o las, lista(s) de canales. En general las guías no hace falta configurarlas por separado ya que son detectadas automáticamente a partir de las listas de canales.

  • Cada lista de canales será un proveedor de IPTV diferente, así tendremos uno para el catchup normal y otro para las grabaciones en la nube.

  • Por separado, y en caso de usar la funcionalidad de grabaciones, tendremos una lista de canales que tendremos que configurar como tipo VOD, es decir, en lugar de tener URLs de canales, tiene URLs con enlaces a grabaciones locales, servidas directamente por este proxy por HTTP.

  • A la hora de configurar cualquier cliente (TiviMate, OTT, Kodi u otro) es recomendable que en los ajustes del mismo desactivéis cualquier tipo de buffer de red que tenga, lo dejéis a 0.

  • De igual manera, es importante que lo configuréis para que la guía se recargue con la mayor frecuencia posible, y que no use caché si la ofrece (como el Kodi). El backend actualiza a cada hora en punto la guía general, y cada 5 minutos las grabaciones en la nube. La lista de grabaciones locales se indexa al ejecutarse el proxy y se actualiza a medida que se realizan grabaciones.

  • Por último, aseguraos de que el cliente que uséis guarda al menos 8 días de historial del EPG y en el caso de las Grabaciones en la Nube lo óptimo sería que no caducasen nunca. Desconozco el tiempo exacto que Movistar permite tener dichas grabaciones almacenadas. Grabaciones que no son más que eventos de la EPG que no se borran de la parrilla, así es como funcionan, de manera que las grabaciones se comparten entre los clientes.

  • En el caso del Kodi IPTV Simple, además de añadir la lista de canales y la guía (sin caché) en los ajustes del addon, deberemos activar el Catchup en modo Flussonic con 8 días de catchup y la opción de Reproducir desde la EPG en modo Live TV. De esta manera conseguiremos una experiencia de uso prácticamente idéntica a la del TiviMate, manteniendo la interfaz de LiveTV con el Catchup, con reproducción continua, etc.

Kodi-PVR-General Kodi-PVR-Guia Kodi-IPTV_Simple-General Kodi-IPTV_Simple-EPG Kodi-IPTV_Simple-Catchup

Posibles problemas

  • La última versión del TiviMate por desgracia tiene un bug que hace que en la NVIDIA Shield no funcione para nada, pese a ser el software ideal con el que acceder. En otros dispositivos, funciona perfectamente.

Podéis encontrar un apk con la versión anterior buscando por tivimate 3.9 apk

Espero que se solucione pronto.

  • En ocasiones, mientras se ve un diferido reciente, la transmisión da un salto temporal de forma repentina. La razón es un cambio en la programación que el cliente desconoce, debido a que actualiza la guía con muy poca frecuencia. El proxy descarga la EPG cada hora en punto, lo que parece ser suficiente, o en lugar de un salto la transmisión se detendría. Por tanto, lo ideal sería actualizar la EPG cada 20-30 minutos aunque no siempre es posible. Muchos clientes sólo permiten actualizarla cada 4 o más horas, así que están expuestos a sufrir la molestia.

    • Solución rápida: ir a los ajustes, borrar y recargar la guía.

    • Solución idónea: buscar que al cliente le añadan la posibilidad de actulizar la guía con mayor frecuencia.

  • Cualquier duda o consulta, o si os encontráis con un cliente con catchup que os parece que debería funcionar con este proxy pero no lo hace (pienso en clientes incluidos en SmartTVs modernos), no dudéis en abrir una incidencia, ya sea en Github o en Gitlab.

Grabaciones automáticas: Temporizadores

Existe una funcionalidad de grabaciones automáticas a partir de unos temporizadores que podremos definir con frases insensibles a mayúsculas, acentos y eñes y clasificadas por canales.

Por desgracia esta funcionalidad no es posible usarla de forma cómoda con el mando a distancia.

Será necesario establecer la variable de entorno RECORDINGS, en Windows editando el fichero movistar-u7d.ps1, con la ruta donde queramos realizar las grabaciones y tendremos que editar el fichero timers.conf que deberá existir en el $HOME, o nuestra carpeta personal en Windows, con el siguente formato, llamado TOML, que resulta fácil para los humanos:

default_language = "VO"
sync_cloud = true
sync_cloud_language = "VO"

[match]
657 = [
    "Alienigenas",
    "Area 51",
    "Extraterrestres",
    "Nasa",
    "Ovnis",
    "^Desmontando el cosmos$",
    "^El universo segun Stephen Hawking$",
]
1825 = [
    "^Cuarto Milenio$ ## Esp",
    "^Horizonte$ ## Esp",
]
4455 = [
    "Einstein",
    "Hawking",
    "La Luna",
    "Tesla",
    "Universo",
    "Basura espacial ## Esp",
    "Los planetas",
    "Documentos TV",
    "Sobrehumanos",
    "Marte",
    "Pluton",
    "Saturno",
    "Venus",
]
4714 = [
    "^American Dad$ ## 12:15",
    "^American Dad$ ## Esp ## 15:00",
    "^Los Simpson S(24|25|26|27|28|29|30|31|32|33)E\\d\\d[ $] ## Esp",
]

La primera clave, language es opcional. La podemos incluir para indicar que por defecto queremos que todas las grabaciones queden con la pista de audio que se recibe como secundaria como principal.

match contiene una lista por canales de cadenas de búsqueda, que constituyen los temporizadores. El número identificador de cada canal lo podemos ver en la lista general de los mismos.

Lás búsquedas se hacen de forma recurrente y las grabaciones se hacen no de los directos, sino del catchup. Esto permite hacerse con todos los episodios de cualquier serie o programa que queramos, de toda la última semana, con sólo añadir su nombre en el canal correspondiente en un fichero como el de arriba.

Cada cadena de texto es en realidad una expresión regular, como podéis ver en alguno de los ejemplos con símbolos extraños, aunque insensibles a acentos, eñes y mayúsculas. Lo más importante es poder poner "^" para indicar que debe ser el principio del título, y "$" para indicar el final.

Podemos definir por temporizador qué pista de audio queremos como principal. Si el temporizador finaliza con " ## Esp" o " ## VO", estaremos indicando la pista que queremos, si la primera o la segunda. En el ejemplo de arriba se define la VO como comportamiento por defecto, es decir se especifica que las grabaciones deben tener como pista de audio principal la que llega como secundaria y, por separado, se definen varios temporizadores en los que se especifica que las grabaciones se hagan con la pista de audio normal como principal " ## Esp".

Tenemos también la posibilidad de especificar a qué hora queremos grabar un programa. Igual que podemos especificar la pista de audio, separado por " ## ", podemos poner la hora y minuto de emisión del programa que nos interesa: " ## HH:MM. Esto se puede combinar con lo anterior, como se ve en los ejemplos de arriba. Si queremos grabar un programa en varios horarios diferentes, simplemente repetimos el temporizador, como se ve arriba. La hora que especificamos tiene cierta flexibilidad, serán incluídos todos los programas emitidos dentro de un margen de 10 minutos.

El orden de los dos campos anteriores, pista de audio y horario, no importa. Si repetimos el mismo, como poner dos veces un idioma o dos veces una hora, la última opción ganará. Y si añadimos más opciones, separadas por " ## ", serán ignoradas por completo.

Como se mencionó antes, las grabaciones se realizan desde el catchup, empezando después de que hayan finalizado y el EPG se haya actualizado una vez. Esto es con la intención de que cualquier cambio en el horario esté reflejado ya en la guía y así tener más posibilidades de grabar entero el evento. Esto también implica que se pueden reintentar en caso de problemas, por lo que las grabaciones se comprueban antes de ser archivadas como correctas. En caso de cualquier error, se reintentan poco después. De esta manera, podemos confiar en que todo lo grabado quede perfecto, sin el más mínimo error.

El control de qué grabaciones se reintentan, o no, viene determinado por el fichero recordings.json que se generará automáticamente y se actualizará con cada grabación hecha. Si queremos que una grabación existente se sobreescriba, bastará con eliminarla de este recordings.json y reiniciar movistar_epg.py. Si el temporizador que la generó sigue existiendo en el fichero timers.conf, la grabación se repetirá poco después, hasta que sea satisfactoria. En el caso de resultar incompleta tres veces seguidas pero con la misma duración total las tres veces, se archivará como correcta.

Por último, las grabaciones se realizan en carpetas con el nombre de la serie si lo son. En caso de programas periódicos de noticias, no clasificados como series, serán grabados en una carpeta con el nombre del programa y cada grabación llevará añadida la fecha, de manera que se puedan grabar noticias diarias. En todos los casos, las grabaciones serán expuestas en la .m3u de grabaciones locales: recordings.m3u o grabaciones.m3u.

Si se activa la opción RECORDINGS_PER_CHANNEL irán además dentro de una carpeta por cada canal.

Ante cualquier duda sobre qué temporizador está iniciando una grabación, activando la opción de DEBUG se podrá ver con detalle.

Cómo funciona

  • Los canales son accesibles en URLs como: http://192.168.1.10:8888/{nombre_canal}.ts o http://192.168.1.10:8888/{numero_canal}/mpegts

El nombre de canal debe ir sin espacios, podemos evitar tanto las palabras HD como TV, y es insensible a mayúsculas/minúsculas. Así podemos ver el directo de Neox HD accediendo a http://192.168.1.10:8888/neox.ts

El número de canal es el interno, tal como figuran en la lista de canales principal.

  • Se puede acceder a cualquier instante de los últimos 7 días en URLs como: http://192.168.1.10:8888/{canal}/{YYYYMMDDHHMM}, http://192.168.1.10:8888/{canal}/{YYYYMMDDHHMMSS} y http://192.168.1.10:8888/{canal}/{timestamp}

Aquí como canal podemos usar tanto el nombre como el número interno, con las mismas premisas para el nombre que en los directos.

  • Y a las grabaciones en la nube de Movistar, con mucho más tiempo de almacenado: http://192.168.1.10:8888/cloud/{canal}/{YYYYMMDDHHMM}, http://192.168.1.10:8888/cloud/{canal}/{YYYYMMDDHHMMSS} y http://192.168.1.10:8888/cloud/{canal}/{timestamp}

  • Opcionalmente, el timestamp puede ir precedido de una palabra y/o seguido de una duración en segundos así como de una extensión: http://192.168.1.10:8888/{canal}/{palabra}-{timestamp}-{duracion}.{extension}. Esto es para tener la mayor compatibilidad posible con diferentes clientes.

  • Adicionalmente, la funcionalidad de realizar grabaciones es accesible en el endpoint: /record/{canal}/{timestamp}?cloud=1&mp4=1&time=1200&vo=1 donde en lugar del timestamp también valen los formatos de fecha {YYYYMMDDHHMM} y {YYYYMMDDHHMMSS} y los parámetros, todos opcionales, indican:

    1. cloud=1: queremos grabar en local una grabación existente en nuestra nube de Movistar.
    2. mp4=1: queremos la grabación en un fichero .mp4 sin subtítulos más un fichero .sub en caso de tenerlos.
    3. time=segundos: tiempo en segundos que deseamos grabar. El límite actual será el de la duración del programa de catchup en cuestión, es decir, si le indicamos que grabe más allá de lo que dura un programa, se detendrá tan pronto como Movistar corte la transmisión del mismo. Si bien en ocasiones las transmisiones se extienden, lo habitual es que duren un minuto por encima de la duración que figura en la EPG.
    4. vo=1: queremos la pista de audio secundaria, habitualmente con audio en versión original, como pista de audio principal.

Esto nos permite grabar con facilidad pequeños fragmentos de programas o programas enteros. No vale, sin embargo, para grabar directos ni varios programas seguidos. Para directos siempre tenemos la opción de guardar la dirección del canal directo con algo como wget.

Las grabaciones llevan las pistas de audio mp2 transcodeadas a aac para que se puedan reproducir sin problemas con un navegador como el Chrome.

Todas ellas quedan almacenadas con el nombre del programa, carátula, etc, tal como sucede con los temporizadores.

  • Por último, las grabaciones son accesibles desde http://192.168.1.10:8888/recording/?{fichero}

Donde el fichero se buscará, con ruta incluida, en la carpeta indicada por RECORDINGS. Se devuelve por HTTP con content-range, por lo que debería ser reproducible con cualquier tipo de cliente.

Componentes

Este software consta de cuatro partes. Las dos primeras son dos microservicios escritos en python asíncrono, con Sanic, el tercero es también asíncrono pero sin Sanic, al menos cuando se ejecuta como script independiente, y el último se encarga de descargar la EPG y generar las listas de canales y guías de programación. El extra es un fichero de ejemplo para montarnos gráficas estadísticas con Grafana:

  • movistar_u7d: el microservicio principal y fachada del proxy con el que se comunica el cliente final, como el TiviMate. Se ejecuta en varios procesos simultáneos, número determinado por la variable de entorno U7D_THREADS que por defecto es 4.

  • movistar_epg: el segundo microservicio escrito con Sanic. Mantiene el estado necesario para que el anterior sea funcional puro y pueda ejecutarse en múltiples procesos sin problemas. Está encargado de generar y actualizar las listas de canales y de grabaciones y las guías de programación, así como de gestionar los temporizadores de las grabaciones locales. También se encarga de lás métricas Prometheus, aunque sean luego servidas por el anterior.

  • movistar_vod: contiene el código responsable de negociar con Movistar el acceso a los programas de catchup. Así mismo, se ejecuta como script independiente para realizar las grabaciones con ffmpeg.

  • movistar_tvg: encargado de generar las listas de canales y las guías programación, así como de guardar una caché de los últimos 7 días de la EPG, de manera que se ejecuta de forma recurrente (cada hora en punto para la guía general, cuando es necesario para el resto de los casos).

Esta caché que genera el movistar_tvg es imprescindible para que todo el proceso funcione bien. Los clientes con catchup flussonic, como el TiviMate, sólo se preocupan por el canal y un timestamp, que define un momento preciso en el tiempo. El proxy es el encargado de encontrar qué programa de la EPG corresponde a ese canal en ese momento y negociar con Movistar la reproducción, por lo que esta caché, que sirve de índice, resulta esencial para que todo pueda funcionar.

  • grafana-dashboard.json: dashboard para Grafana con dos paneles de catchups y directos. Para usar conectado con las métricas Prometheus. Lo podéis ver en el último pantallazo un poco más arriba.

De dónde nace

Este proyecto nació del descontento de acceder a los canales de TV de Movistar a través de su app de Movistar, que dicho de forma elegante, está muy por detrás de la competencia.

  • No tiene ningún tipo de integración real con el Android, ni siquiera para la entrada de datos. Intentad usar un mini teclado, veréis lo cómodo que es. Te dan ganas de llamar al soporte y decirles la categoría de software que venden con su producto.

  • Tiene un click molesto cada vez que pulsas un botón en el mando, no se puede deshabilitar.

  • El vídeo es de menor calidad que el que llega por la VLAN de TV, en lugar de a 50HZ es a 25, y se nota.

  • Se congela todo el tiempo, se cuelga.

  • Debido al magnífico DRM, en el siguiente video, el video nunca se ve: Movistar+_20210320.mp4

Durante años usé udpxy para acceder a los directos desde cualquier cliente IPTV, aunque estuviera conectado por wifi. Con la lista de canales y programación que podías obtener con el fantástico tv_grab_es_movistartv no hacía falta nada más que un servidor web para servirlo todo. Faltaba el acceso a los últimos 7 días.

Para esto, lo mejor que hubo durante mucho tiempo es un addon cerrado para el magnífico Kodi, que funciona relativamente bien (con Kodi 18, no lo hay para Kodi 19). Te permite reproducir programas de la parrilla de los últimos 7 días; también te permite hacer grabaciones en local o en la nube, que son accesibles después para reproducir.

Tenía unos cuantos peros:

  • Aunque puedes reproducir un programa, no puedes avanzar, ni pausar, ni rebobinar, sólo reproducir y detener.
  • Con frecuencia la reproducción fallaba y aunque a veces podías continuar en el mismo punto, a menudo tenías que volver a reproducirlo desde el principio.
  • Lo peor de todo eran los micro cortes durante la reproducción, imposible de eliminar por completo.

En suma, era usable para grabaciones locales y para directos, para otros usos decepcionaba bastante.

A continuación de ésto, descubrí el framework de entrada de TV del Android, que es lo que usan todos los grandes fabricantes cuando ofrecen televisores con Android TV. De no tener SmartTV, hay diferentes TVboxes que hacen smart cualquier televisor con HDMI. Personalmente uso la NVIDIA Shield y el Xiaomi Mi Box S. El Android aporta las bases necesarias para poder acceder a cualquier tipo de contenido. Hay una aplicación simple de ejemplo que viene con el AOSP, la versión libre del Android que todos los que venden aparatos con Android utilizan. Además, se pueden usar otros clientes (que a su vez utilizan dicho framework). Por lo que sé, Sony y Phillips tienen sus propios clientes, aunque no los he probado.

Un poco más adelante, descubrí el que creo que es, si no el mejor, uno de los mejores clientes para acceder a la TV. El TiviMate.

Pasó a ser mi modo favorito de acceder a los canales, nada se le acercaba. Es super fluido, te permite hacer no solo PiP de lo que estás viendo, sino que puedes estar visionando hasta 9 canales simultáneos como si fuera un sistema de cámaras de seguridad.

Tan contento con él estaba que tenía que poder usar el resto de funcionalidad. Daba acceso a servicios de catchup (últimos 7 días), y lo hacía de dos maneras diferentes. Después de hacer pruebas, monitorear qué conexiones realizaba cuando intentabas ver algo de los últimos 7 días, ...

Se me ocurrió que podía hacer algún tipo de proxy entre dicho TiviMate con catchup flussonic (de las variantes de catchup que soporta es el que más extendido he encontrado y a la vez es el más sencillo e intuitivo de implementar) y la IPTV de Movistar.

A día de doy alterno constantemente entre clientes, cada uno tiene sus pros y sus contras, ninguno es perfecto. Lo ideal de este proxy es que te abre un mundo de posibilidades para acceder a la IPTV, de forma estable y sin cortes.

Agradecimientos

Sin ningún orden en especial:

  • WiLloW: por su tv_grab_es_movistartv, un trabajo increíble que desenmaraña todos los metadatos de MovistarTV.

  • XXLuigiMario: por su u7d.py que fue, en cierta manera, el punto de partida de todo, aunque le faltase media funcionalidad. Partiendo de él y analizando el tráfico del addon cerrado, con todos sus fallos, conseguí entender e implementar correctamente la negociación rtsp de la que depende toda reproducción de los últimos 7 días.

  • Sanic Framework: hace comodísima la programación de microservicios web.

  • Movistar: por ofrecer fantásticas opciones de conexión por fibra con TV con todos sus canales como streams IPTV estándar y de hacer accesible también su servicio de catchup. Disponéis de una red arquitecturada con una calidad increíble. Lástima que sólo ofrezcáis acceder a través de una app y un decodificador bastante lamentables, sin duda no a la altura del resto de vuestra infraestructura y oferta.

Futuro

De momento Movistar se ha detenido en seguir encriptando sus emisiones en TDT. Hay algún canal que no se puede ver, pero la mayoría sí. Esperemos que no empeore.

Aquí podéis ver un intento (vano?) de hacerlos entrar en razón. Desde que lo escribí no han encriptado ningún canal adicional.

Donar con PayPal

Si te gusta mucho usar este software y te apetece invitarme a tomar algo:

Donar con Paypal

movistar-u7d's People

Contributors

jmarcet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

movistar-u7d's Issues

Error en los microservicios Sanic

Estoy tratando de poner en marcha tu proyecto en una Raspberry Pi 4 con Ubuntu Server 20.10 de 64bits.

Mi pasos:

  • Instalación limpia y actualizada.
  • Configuro una IP estática (en lugar de usar dhcp)
  • Instalo ffmpeg, mkvtoolnix y python3-pip
  • Clono tu repositorio con git clone ...
  • Instalo las dependencias con pip3 install -r requirements.txt
  • Copio los ficheros indicados .py a la ruta usr/local/bin/
  • Copio y edito los ficheros .service a la ruta /etc/systemd/system/
    • En las ediciones, habilito las líneas de Environment para HOME, LAN_IP y SANIC_PORT, el resto se dejan comentadas
  • Configuro y arranco los servicios con systemctl enable ... y systemctl start ...

Si abro el fichero /var/log/syslog, al final del mismo aparecen los mensajes siguientes:

[...]
Jan  5 10:39:03 pi-u7d systemd[1]: Started Movistar U7D - EPG State service.
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] Sanic v21.12.0
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] Goin' Fast @ http://127.0.0.1:8889
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] mode: production, single worker
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] server: sanic
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] python: 3.9.7
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] platform: Linux-5.13.0-1012-raspi-aarch64-with-glibc2.34
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [INFO] packages: sanic-routing==0.7.2
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [ERROR] Experienced exception while trying to serve
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: Traceback (most recent call last):
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/base/root.py", line 56, in __setattr__
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     super().__setattr__(name, value)
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: AttributeError: 'Sanic' object has no attribute 'metrics'
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: The above exception was the direct cause of the following exception:
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: Traceback (most recent call last):
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1204, in run
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     serve_single(server_settings)
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 206, in serve_single
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     serve(**server_settings)
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 130, in serve
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     loop.run_until_complete(app._server_event("init", "before"))
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1980, in _server_event
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     await self.dispatch(
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 191, in dispatch
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     return await dispatch
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 161, in _dispatch
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     retval = await maybe_coroutine
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1522, in _listener
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     maybe_coro = listener(app, loop)
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic_prometheus/__init__.py", line 108, in before_start
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     app.metrics = {}
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:   File "/usr/local/lib/python3.9/dist-packages/sanic/base/root.py", line 58, in __setattr__
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]:     raise AttributeError(
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: AttributeError: Setting variables on Sanic instances is not allowed. You should change your Sanic instance to use instance.ctx.metrics instead.
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: [2022-01-05 10:39:04] [2414] [CRITICAL] AttributeError('Setting variables on Sanic instances is not allowed. You should change your Sanic instance to use instance.ctx.metrics instead.')
Jan  5 10:39:04 pi-u7d movistar_epg.py[2414]: sys:1: RuntimeWarning: coroutine 'Loop.create_server' was never awaited
Jan  5 10:39:04 pi-u7d systemd[1]: movistar_epg.service: Main process exited, code=exited, status=1/FAILURE
Jan  5 10:39:04 pi-u7d systemd[1]: movistar_epg.service: Failed with result 'exit-code'.
Jan  5 10:39:04 pi-u7d systemd[1]: movistar_epg.service: Consumed 1.602s CPU time.

Si ejecuto manualmente tv_grab_es_movistartv --tvheadend /home/MovistarTV.m3u --output /home/guide.xml se generan los ficheros correctamente. Aparentemente sólo está fallando la parte en la que se instalan como servicios.

Alguna idea?

Error movistar_epg.py

Estoy intentando hacerlo funcionar pero no hay manera de que funcione. Al ejecutar movistar_epg.py me da este error:

root@HomeServer:~# python3 /usr/local/bin/movistar_epg.py
[2021-12-18 11:58:31] [5378] [INFO] Goin' Fast @ http://127.0.0.1:8889
[2021-12-18 11:58:31] [5378] [WARNING] Missing channels data!. Need to download it. Please be patient...
[2021-12-18 12:02:30] [5378] [INFO] Loaded fresh EPG data
[2021-12-18 12:02:30] [5378] [INFO] Loaded Channels metadata
[2021-12-18 12:02:32] [5378] [WARNING] 1616 53601715 not located in Cloud KeyError('episode')
[2021-12-18 12:02:43] [5378] [ERROR] Experienced exception while trying to serve
Traceback (most recent call last):
File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1051, in run
serve_single(server_settings)
File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 199, in serve_single
serve(**server_settings)
File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 146, in serve
loop.run_until_complete(app._server_event("init", "after"))
File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1498, in _server_event
await self.dispatch(
File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 163, in dispatch
return await dispatch
File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 133, in _dispatch
retval = await maybe_coroutine
File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1382, in _listener
await maybe_coro
File "/usr/local/bin/movistar_epg.py", line 82, in after_server_start
await reload_epg()
File "/usr/local/bin/movistar_epg.py", line 417, in reload_epg
await update_epg()
File "/usr/local/bin/movistar_epg.py", line 724, in update_epg
await reload_epg()
File "/usr/local/bin/movistar_epg.py", line 453, in reload_epg
await update_cloud(forced=True)
File "/usr/local/bin/movistar_epg.py", line 669, in update_cloud
merge()
File "/usr/local/bin/movistar_epg.py", line 660, in merge
for event in list(set(new_cloud[channel_id]) - set(_EPGDATA[channel_id])):
KeyError: 4885
[2021-12-18 12:02:43] [5378] [CRITICAL] KeyError(4885)

Lo raro es que el grabber funciona y no da error.

Estoy usando Debian 11 con Python 3.9.2.

No se que mirar ya.

don't support 32bits cpu.

As video applicacion a old computers that don't have x64 can run it (specially using dxva).but unfortunly the windows version in download section appear only support 64 bit cpu .

Error KeyError: 'RES_BASE_URI'

Hola, No se nada de programacion y me encuentro con un error en el programa el cual sale la pantalla de comandos y se cierra sola aqui todo lo que sale en la pantalla de comandos.

[2022-06-15 04:47:00] [INI] [INFO] =================
[2022-06-15 04:47:00] [INI] [INFO] Movistar U7D v5.1
[2022-06-15 04:47:00] [INI] [INFO] =================
[2022-06-15 04:47:00] [INI] [INFO] IPTV address: 192.168.1.43
[2022-06-15 04:47:04] [EPG] [INFO] -----------------------
[2022-06-15 04:47:04] [EPG] [INFO] Movistar U7D - EPG v5.1
[2022-06-15 04:47:04] [EPG] [INFO] -----------------------
[2022-06-15 04:47:04] [EPG] [WARNING] Missing channels data! Need to download it. Please be patient...
[2022-06-15 04:47:05] [TVG] [INFO] -----------------------
[2022-06-15 04:47:05] [TVG] [INFO] Movistar U7D - TVG v5.1
[2022-06-15 04:47:05] [TVG] [INFO] -----------------------
[2022-06-15 04:47:05] [TVG] [INFO] Descargando configuración del cliente
[2022-06-15 04:47:05] [TVG] [INFO] Descargando perfil del servicio
[2022-06-15 04:47:05] [TVG] [INFO] Descargando parámetros de configuración
[2022-06-15 04:47:05] [TVG] [INFO] tvPackages: UTXC3|UTXC8|UTXFI
[2022-06-15 04:47:05] [TVG] [INFO] Demarcation: 12
[2022-06-15 04:47:05] [TVG] [INFO] Nuevos End Points: ['epNoCach1', 'epNoCach10', 'epNoCach11', 'epNoCach2', 'epNoCach3', 'epNoCach4', 'epNoCach5', 'epNoCach6', 'epNoCach7', 'epNoCach8', 'epNoCach9']
Traceback (most recent call last):
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts_startup_.py", line 113, in run
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts\Console.py", line 15, in run
File "movistar_tvg.py", line 1438, in
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\runners.py", line 44, in run
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\base_events.py", line 646, in run_until_complete
File "movistar_tvg.py", line 1341, in tvg_main
File "movistar_tvg.py", line 490, in get_service_config
KeyError: 'RES_BASE_URI'
[2022-06-15 04:47:08] [EPG] [ERROR] [2/3]...
[2022-06-15 04:47:08] [TVG] [INFO] -----------------------
[2022-06-15 04:47:08] [TVG] [INFO] Movistar U7D - TVG v5.1
[2022-06-15 04:47:08] [TVG] [INFO] -----------------------
[2022-06-15 04:47:08] [TVG] [INFO] Descargando configuración del cliente
[2022-06-15 04:47:08] [TVG] [INFO] Descargando perfil del servicio
[2022-06-15 04:47:08] [TVG] [INFO] Descargando parámetros de configuración
[2022-06-15 04:47:08] [TVG] [INFO] tvPackages: UTXC3|UTXC8|UTXFI
[2022-06-15 04:47:08] [TVG] [INFO] Demarcation: 12
[2022-06-15 04:47:08] [TVG] [INFO] Nuevos End Points: ['epNoCach1', 'epNoCach10', 'epNoCach11', 'epNoCach2', 'epNoCach3', 'epNoCach4', 'epNoCach5', 'epNoCach6', 'epNoCach7', 'epNoCach8', 'epNoCach9']
Traceback (most recent call last):
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts_startup_.py", line 113, in run
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts\Console.py", line 15, in run
File "movistar_tvg.py", line 1438, in
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\runners.py", line 44, in run
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\base_events.py", line 646, in run_until_complete
File "movistar_tvg.py", line 1341, in tvg_main
File "movistar_tvg.py", line 490, in get_service_config
KeyError: 'RES_BASE_URI'
[2022-06-15 04:47:11] [EPG] [ERROR] [3/3]...
[2022-06-15 04:47:12] [TVG] [INFO] -----------------------
[2022-06-15 04:47:12] [TVG] [INFO] Movistar U7D - TVG v5.1
[2022-06-15 04:47:12] [TVG] [INFO] -----------------------
[2022-06-15 04:47:12] [TVG] [INFO] Descargando configuración del cliente
[2022-06-15 04:47:12] [TVG] [INFO] Descargando perfil del servicio
[2022-06-15 04:47:12] [TVG] [INFO] Descargando parámetros de configuración
[2022-06-15 04:47:12] [TVG] [INFO] tvPackages: UTXC3|UTXC8|UTXFI
[2022-06-15 04:47:12] [TVG] [INFO] Demarcation: 12
[2022-06-15 04:47:12] [TVG] [INFO] Nuevos End Points: ['epNoCach1', 'epNoCach10', 'epNoCach11', 'epNoCach2', 'epNoCach3', 'epNoCach4', 'epNoCach5', 'epNoCach6', 'epNoCach7', 'epNoCach8', 'epNoCach9']
Traceback (most recent call last):
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts_startup_.py", line 113, in run
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts\Console.py", line 15, in run
File "movistar_tvg.py", line 1438, in
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\runners.py", line 44, in run
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\base_events.py", line 646, in run_until_complete
File "movistar_tvg.py", line 1341, in tvg_main

channels.m3u no incluye a "La1 HD"

El fichero de canales generado no incluye "La1 HD" (id de canal 2543).

Si modifico tv_grab_es_movistartv y añado:
"2543",
al array epg_channels, se añade a la lista de canales y se puede ver perfectamente.

epg_channels = [

Tal vez en algunas regiones haya cambiado de número. En Murcia sigue siendo el 2543 y aún está activo.

Error al instalar con docker

Buenas,

Antes que todo, mil gracias por todo este trabajo.

Como verás a continuación, me da un error al intentar instalar con docker. A ver si me puedes ayudar... la verdad es que si lo consiguiera estaría encantado.

Gracias!!!

image

Error al ejecutar 'tv_grab_es_movistartv'

En un servidor Ubuntu Server 20.04.3 LTS, recién instalado, limpio. Sólo con apache3-pip para poder ejecutar:

pip3 install -r requirements.txt

He seguido tus instrucciones y colocado los scripts en /usr/local/bin/ ejecutando:

cp movistar_u7d.py movistar_epg.py tv_grab_es_movistartv vod.py /usr/local/bin/

Al ejecutar el siguiente comando:

root@movistar-u7d:/home/# tv_grab_es_movistartv --tvheadend /home/MovistarTV.m3u --output /home/guide.xml

termina con el siguiente error:

..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1404, in <module>
    ElTr.indent(xml)
AttributeError: module 'xml.etree.ElementTree' has no attribute 'indent'
root@movistar-u7d:/home/.xmltv#

En realidad tiene muchos mas puntos. Varias páginas, durante varios minutos apareciendo puntos... y finalmente termina con ese error .

Parece que el problema está en:

ElTr.indent(xml)

¿Alguna idea?

version.py requerida pero ausente en las instrucciones para Linux/UNIX/OS X

Buenos días,

Acabo de actualizar mi instalación (en Raspberry PI) a partir de los cambios que subiste ayer. Al intentar ejecutar de nuevo los servicios me saltan las siguientes advertencias y error al final:

root@pi-u7d:/usr/local/bin# movistar_u7d.py
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/movistar_u7d.py", line 27, in <module>
    from movistar_epg import get_ffmpeg_procs
  File "/usr/local/bin/movistar_epg.py", line 26, in <module>
    from version import _version
ModuleNotFoundError: No module named 'version'
root@pi-u7d:/usr/local/bin#

Por lo visto el nuevo fichero version.py también es necesario en el directorio donde están el resto de ficheros, /usr/local/bin/ según tus instrucciones para Instalación en Linux/UNIX/OS X.

Actualmente indicas:
cp movistar_u7d.py movistar_epg.py tv_grab_es_movistartv vod.py /usr/local/bin/

Actualiza la línea para que también se copie version.py
cp movistar_u7d.py movistar_epg.py tv_grab_es_movistartv vod.py version.py /usr/local/bin/

Copiando ese fichero y ejecutando de nuevo pip3 install -r requirements.txt vuelve a funcionar todo.

Quedan pendientes esas advertencias sobre la conveniencia de usar el módulo importlib en lugar de imp.

Saludos.

Error Docker

Buenas, vaya currazo que habeís hecho.

Me decidí a probar vuestro pedazo de proyecto en una Rpi 3plus y con conexión 4g, en la rasberry esta instalado pihole y docker.

El docker compose que he modificado es:

version: '2.4'

services:
movistar_u7d:
# build: .
image: registry.marcet.info/javier/movistar-u7d
container_name: movistar_u7d
cap_add:
- NET_ADMIN
- NET_BROADCAST
- SYS_ADMIN
- SYS_NICE
restart: on-failure
network_mode: host
volumes:
- /etc/localtime:/etc/localtime
#- ./:/app
#- HOME:/home
#- RECORDINGS:/recordings
environment:
- DEBUG=1
- EPG_THREADS=4
- EXTRA_CHANNELS="4917 5066"
- IPTV_BW=85000
- IPTV_IFACE=wlan0
- LAN_IP=192.168.1.10
- MP4_OUTPUT=1
- NOSUBS=1
- RECORDING_THREADS=4
- RECORDING_PER_CHANEL=1
- SANIC_PORT=8888
- SANIC_THREADS=4
- U7D_UID=NOBODY
- VERBOSE_LOGS=0
#devices:
#- /dev/dri:/dev/dri
# cpu_shares: 8192
# cpus: 4
# mem_limit: 3gb
# memswap_limit: 3gb
#healthcheck:
#test: ping -c 1 -W 1 www-60.svc.imagenio.telefonica.net | grep -q '172.26.22.23' && nc -vz ${SANIC_HOST} 8888
#interval: 30s
#timeout: 5s
#retries: 3

   # vim: et ci pi sts=2 sw=2 ts=2

me da error al arracar el docker-compose al llegar a movistar_tvg.py

movistar_u7d | [2022-04-12 20:52:19] [TVG] [INFO] Movistar U7D - TVG v5.0
movistar_u7d | [2022-04-12 20:52:19] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-12 20:52:19] [TVG] [INFO] Creando caché en /home/.xmltv/cache
movistar_u7d | [2022-04-12 20:52:19] [TVG] [INFO] Descargando configuración del cliente
movistar_u7d | [2022-04-12 21:17:21] [TVG] [INFO] Descargando perfil del servicio
movistar_u7d | [2022-04-12 21:42:23] [TVG] [INFO] Descargando parámetros de configuración
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_tvg.py", line 1441, in
movistar_u7d | asyncio.run(tvg_main())
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d | return loop.run_until_complete(main)
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d | return future.result()
movistar_u7d | File "/app/movistar_tvg.py", line 1346, in tvg_main
movistar_u7d | config = await mtv.get_service_config()
movistar_u7d | File "/app/movistar_tvg.py", line 481, in get_service_config
movistar_u7d | dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
movistar_u7d | TypeError: 'NoneType' object is not subscriptable
movistar_u7d | [2022-04-12 22:07:26] [EPG] [ERROR] Waiting 15s before trying to update EPG again [2/5]...
movistar_u7d | [2022-04-12 22:07:42] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-12 22:07:42] [TVG] [INFO] Movistar U7D - TVG v5.0
movistar_u7d | [2022-04-12 22:07:42] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-12 22:07:42] [TVG] [INFO] Descargando configuración del cliente
movistar_u7d | [2022-04-12 22:32:44] [TVG] [INFO] Descargando perfil del servicio
movistar_u7d | [2022-04-12 22:57:48] [TVG] [INFO] Descargando parámetros de configuración
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_tvg.py", line 1441, in
movistar_u7d | asyncio.run(tvg_main())
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d | return loop.run_until_complete(main)
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d | return future.result()
movistar_u7d | File "/app/movistar_tvg.py", line 1346, in tvg_main
movistar_u7d | config = await mtv.get_service_config()
movistar_u7d | File "/app/movistar_tvg.py", line 481, in get_service_config
movistar_u7d | dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
movistar_u7d | TypeError: 'NoneType' object is not subscriptable
movistar_u7d | [2022-04-12 23:22:50] [EPG] [ERROR] Waiting 15s before trying to update EPG again [3/5]...
movistar_u7d | [2022-04-12 23:23:07] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-12 23:23:07] [TVG] [INFO] Movistar U7D - TVG v5.0
movistar_u7d | [2022-04-12 23:23:07] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-12 23:23:07] [TVG] [INFO] Descargando configuración del cliente
movistar_u7d | [2022-04-12 23:48:09] [TVG] [INFO] Descargando perfil del servicio
movistar_u7d | [2022-04-13 00:13:12] [TVG] [INFO] Descargando parámetros de configuración
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_tvg.py", line 1441, in
movistar_u7d | asyncio.run(tvg_main())
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d | return loop.run_until_complete(main)
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d | return future.result()
movistar_u7d | File "/app/movistar_tvg.py", line 1346, in tvg_main
movistar_u7d | config = await mtv.get_service_config()
movistar_u7d | File "/app/movistar_tvg.py", line 481, in get_service_config
movistar_u7d | dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
movistar_u7d | TypeError: 'NoneType' object is not subscriptable
movistar_u7d | [2022-04-13 00:38:14] [EPG] [ERROR] Waiting 15s before trying to update EPG again [4/5]...
movistar_u7d | [2022-04-13 00:38:31] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-13 00:38:31] [TVG] [INFO] Movistar U7D - TVG v5.0
movistar_u7d | [2022-04-13 00:38:31] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-13 00:38:31] [TVG] [INFO] Descargando configuración del cliente
movistar_u7d | [2022-04-13 01:03:33] [TVG] [INFO] Descargando perfil del servicio
movistar_u7d | [2022-04-13 01:28:36] [TVG] [INFO] Descargando parámetros de configuración
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_tvg.py", line 1441, in
movistar_u7d | asyncio.run(tvg_main())
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d | return loop.run_until_complete(main)
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d | return future.result()
movistar_u7d | File "/app/movistar_tvg.py", line 1346, in tvg_main
movistar_u7d | config = await mtv.get_service_config()
movistar_u7d | File "/app/movistar_tvg.py", line 481, in get_service_config
movistar_u7d | dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
movistar_u7d | TypeError: 'NoneType' object is not subscriptable
movistar_u7d | [2022-04-13 01:53:38] [EPG] [ERROR] Waiting 15s before trying to update EPG again [5/5]...
movistar_u7d | [2022-04-13 01:53:55] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-13 01:53:55] [TVG] [INFO] Movistar U7D - TVG v5.0
movistar_u7d | [2022-04-13 01:53:55] [TVG] [INFO] -----------------------
movistar_u7d | [2022-04-13 01:53:55] [TVG] [INFO] Descargando configuración del cliente
movistar_u7d | [2022-04-13 02:00:15] [TVG] [INFO] Descargando perfil del servicio
movistar_u7d | [2022-04-13 02:00:15] [TVG] [INFO] Descargando parámetros de configuración
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_tvg.py", line 1441, in
movistar_u7d | asyncio.run(tvg_main())
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d | return loop.run_until_complete(main)
movistar_u7d | File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d | return future.result()
movistar_u7d | File "/app/movistar_tvg.py", line 1346, in tvg_main
movistar_u7d | config = await mtv.get_service_config()
movistar_u7d | File "/app/movistar_tvg.py", line 481, in get_service_config
movistar_u7d | dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
movistar_u7d | TypeError: 'NoneType' object is not subscriptable
movistar_u7d | Process ForkProcess-2:
movistar_u7d | Process ForkProcess-1:
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 315, in _bootstrap
movistar_u7d | self.run()
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
movistar_u7d | self._target(*self._args, **self._kwargs)
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/server/runners.py", line 130, in serve
movistar_u7d | loop.run_until_complete(app._server_event("init", "before"))
movistar_u7d | File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 2000, in _server_event
movistar_u7d | await self.dispatch(
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 191, in dispatch
movistar_u7d | return await dispatch
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 161, in _dispatch
movistar_u7d | retval = await maybe_coroutine
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 1524, in _listener
movistar_u7d | await maybe_coro
movistar_u7d | File "/app/movistar_u7d.py", line 112, in before_server_start
movistar_u7d | _IPTV = get_iptv_ip()
movistar_u7d | File "/app/mu7d.py", line 58, in get_iptv_ip
movistar_u7d | s.connect((IPTV_DNS, 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | /usr/local/lib/python3.10/multiprocessing/process.py:331: RuntimeWarning: coroutine 'Loop.create_server' was never awaited
movistar_u7d | traceback.print_exc()
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 315, in _bootstrap
movistar_u7d | self.run()
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
movistar_u7d | self._target(*self._args, **self._kwargs)
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/server/runners.py", line 130, in serve
movistar_u7d | loop.run_until_complete(app._server_event("init", "before"))
movistar_u7d | File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 2000, in _server_event
movistar_u7d | await self.dispatch(
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 191, in dispatch
movistar_u7d | return await dispatch
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 161, in _dispatch
movistar_u7d | retval = await maybe_coroutine
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 1524, in _listener
movistar_u7d | await maybe_coro
movistar_u7d | File "/app/movistar_u7d.py", line 112, in before_server_start
movistar_u7d | _IPTV = get_iptv_ip()
movistar_u7d | File "/app/mu7d.py", line 58, in get_iptv_ip
movistar_u7d | s.connect((IPTV_DNS, 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | /usr/local/lib/python3.10/multiprocessing/process.py:331: RuntimeWarning: coroutine 'Loop.create_server' was never awaited
movistar_u7d | traceback.print_exc()
movistar_u7d | Process ForkProcess-3:
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 315, in _bootstrap
movistar_u7d | self.run()
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
movistar_u7d | self._target(*self._args, **self._kwargs)
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/server/runners.py", line 130, in serve
movistar_u7d | loop.run_until_complete(app._server_event("init", "before"))
movistar_u7d | File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 2000, in _server_event
movistar_u7d | await self.dispatch(
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 191, in dispatch
movistar_u7d | return await dispatch
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 161, in _dispatch
movistar_u7d | retval = await maybe_coroutine
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 1524, in _listener
movistar_u7d | await maybe_coro
movistar_u7d | File "/app/movistar_u7d.py", line 112, in before_server_start
movistar_u7d | _IPTV = get_iptv_ip()
movistar_u7d | File "/app/mu7d.py", line 58, in get_iptv_ip
movistar_u7d | s.connect((IPTV_DNS, 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | /usr/local/lib/python3.10/multiprocessing/process.py:331: RuntimeWarning: coroutine 'Loop.create_server' was never awaited
movistar_u7d | traceback.print_exc()
movistar_u7d | Process ForkProcess-4:
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 315, in _bootstrap
movistar_u7d | self.run()
movistar_u7d | File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
movistar_u7d | self._target(*self._args, **self._kwargs)
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/server/runners.py", line 130, in serve
movistar_u7d | loop.run_until_complete(app._server_event("init", "before"))
movistar_u7d | File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 2000, in _server_event
movistar_u7d | await self.dispatch(
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 191, in dispatch
movistar_u7d | return await dispatch
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/signals.py", line 161, in _dispatch
movistar_u7d | retval = await maybe_coroutine
movistar_u7d | File "/usr/local/lib/python3.10/site-packages/sanic/app.py", line 1524, in _listener
movistar_u7d | await maybe_coro
movistar_u7d | File "/app/movistar_u7d.py", line 112, in before_server_start
movistar_u7d | _IPTV = get_iptv_ip()
movistar_u7d | File "/app/mu7d.py", line 58, in get_iptv_ip
movistar_u7d | s.connect((IPTV_DNS, 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | /usr/local/lib/python3.10/multiprocessing/process.py:331: RuntimeWarning: coroutine 'Loop.create_server' was never awaited
movistar_u7d | traceback.print_exc()
movistar_u7d | [2022-04-13 02:00:16] [U7D] [INFO] Server Stopped
movistar_u7d | [2022-04-13 02:00:16] [INI] [WARNING] Unknown child process pid 9, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:19] [INI] [WARNING] Unknown child process pid 26, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:22] [INI] [WARNING] Unknown child process pid 28, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:24] [INI] [WARNING] Unknown child process pid 30, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:27] [INI] [WARNING] Unknown child process pid 32, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:29] [INI] [WARNING] Unknown child process pid 34, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:32] [INI] [WARNING] Unknown child process pid 36, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:34] [INI] [WARNING] Unknown child process pid 38, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:36] [INI] [WARNING] Unknown child process pid 40, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:39] [INI] [WARNING] Unknown child process pid 42, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:41] [INI] [WARNING] Unknown child process pid 44, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:44] [INI] [WARNING] Unknown child process pid 46, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:46] [INI] [WARNING] Unknown child process pid 48, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:49] [INI] [WARNING] Unknown child process pid 50, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:51] [INI] [WARNING] Unknown child process pid 52, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:54] [INI] [WARNING] Unknown child process pid 54, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:56] [INI] [WARNING] Unknown child process pid 56, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))
movistar_u7d | OSError: [Errno 101] Network unreachable
movistar_u7d | [2022-04-13 02:00:58] [INI] [WARNING] Unknown child process pid 58, will report returncode 255
movistar_u7d | Traceback (most recent call last):
movistar_u7d | File "/app/movistar_u7d.py", line 501, in
movistar_u7d | _conf = mu7d_config()
movistar_u7d | File "/app/mu7d.py", line 176, in mu7d_config
movistar_u7d | conf["LAN_IP"] = get_lan_ip()
movistar_u7d | File "/app/mu7d.py", line 64, in get_lan_ip
movistar_u7d | s.connect(("8.8.8.8", 53))

¿Os suena este error?

Muchas gracias y saludos

Movistar dns does not seem to be accessible

Hola,

(Hope it's OK if I ask in English, but feel free to reply in Spanish if you prefer).

Seems like nothing is happeing when I start the container with docker-compose, i.e. there nothing in the log.

When I attach to a console and try to ran start.sh or one of the other services, I can see timeout errors. When I try to ping Movistar's DNS server, I get nothing.

PS I'm a Movistar customer and on their network and paying for Movistar+ iptv, so I guess the stream are supposed to be accessible?

Thanks

TypeError: tostring() got an unexpected keyword argument 'xml_declaration'

No puedo descargar la guía EPG. ¿Alguien más experimentado este error?

[2022-03-11 23:56:14] [TVG] [INFO] Generando la guía XMLTV...
[2022-03-11 23:56:14] [TVG] [INFO] XML: Descargando info extendida
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1473, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1408, in main
    guide = ElTr.tostring(xml, encoding="UTF-8", xml_declaration=True)
TypeError: tostring() got an unexpected keyword argument 'xml_declaration'

No se muestra ninguna programación en Jellyfin

Corriendo en un contenedor Docker de https://registry.hub.docker.com/r/jellyfin/jellyfin/

  • Server: jellyfin
  • Version: 10.7.7
  • Operating System: Linux
  • Architecture: X64

Funcionando bien para la version anterior de movistar-u7d (de aproximadamente 1 mes) y con esta configuración:

image

Muestra los siguientes errores en el log:

[2022-02-07 20:22:36.637 +01:00] [INF] [98] Emby.Server.Implementations.LiveTv.TunerHosts.M3UTunerHost: Found m3u channel: "-1 ch-number=\"124\" tvg-id=\"4990.movistar.tv\" group-title=\"U7D - TDT Movistar.es\" tvg-logo=\"http://192.168.1.8:8888/Logos/4990.jpg\",El Toro TV HD"
[2022-02-07 20:22:36.638 +01:00] [INF] [98] Emby.Server.Implementations.LiveTv.TunerHosts.M3UTunerHost: Found m3u channel: "-1 ch-number=\"126\" tvg-id=\"3603.movistar.tv\" group-title=\"U7D - TDT Movistar.es\" tvg-logo=\"http://192.168.1.8:8888/Logos/3603.jpg\",DKISS"
[2022-02-07 20:22:36.638 +01:00] [INF] [98] Emby.Server.Implementations.LiveTv.TunerHosts.M3UTunerHost: Found m3u channel: "-1 ch-number=\"127\" tvg-id=\"3443.movistar.tv\" group-title=\"U7D - TDT Movistar.es\" tvg-logo=\"http://192.168.1.8:8888/Logos/3443.jpg\",Ten"
[2022-02-07 20:22:36.638 +01:00] [INF] [98] Emby.Server.Implementations.LiveTv.TunerHosts.M3UTunerHost: Found m3u channel: "-1 ch-number=\"159\" tvg-id=\"5029.movistar.tv\" group-title=\"U7D - TDT Movistar.es\" tvg-logo=\"http://192.168.1.8:8888/Logos/5029.jpg\",8tv"
[2022-02-07 20:22:36.638 +01:00] [INF] [98] Emby.Server.Implementations.LiveTv.TunerHosts.M3UTunerHost: Found m3u channel: "-1 ch-number=\"999\" tvg-id=\"3103.movistar.tv\" group-title=\"U7D - TDT Movistar.es\" tvg-logo=\"http://192.168.1.8:8888/Logos/3103.jpg\",Movistar Plus+"
[2022-02-07 20:22:36.639 +01:00] [INF] [39] Emby.Server.Implementations.LiveTv.Listings.XmlTvListingsProvider: xmltv path: "http://192.168.1.8:8888/guia.xml"
[2022-02-07 20:22:36.641 +01:00] [ERR] [39] Emby.Server.Implementations.LiveTv.EmbyTV.EmbyTV: Error adding metadata
System.Xml.XmlException: System does not support 'utf8' encoding. Line 1, position 31.
 ---> System.ArgumentException: 'utf8' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
   at System.Text.EncodingTable.InternalGetCodePageFromName(String name)
   at System.Text.EncodingTable.GetCodePageFromName(String name)
   at System.Text.Encoding.GetEncoding(String name)
   at System.Xml.XmlTextReaderImpl.CheckEncoding(String newEncodingName)
   --- End of inner exception stack trace ---
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.CheckEncoding(String newEncodingName)
   at System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(Boolean isTextDecl)
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlReader.ReadToDescendant(String name)
   at Jellyfin.XmlTv.XmlTvReader.GetChannels()
   at Emby.Server.Implementations.LiveTv.Listings.XmlTvListingsProvider.GetChannels(ListingsProviderInfo info, CancellationToken cancellationToken)
   at Emby.Server.Implementations.LiveTv.EmbyTV.EmbyTV.GetEpgChannels(IListingsProvider provider, ListingsProviderInfo info, Boolean enableCache, CancellationToken cancellationToken)
   at Emby.Server.Implementations.LiveTv.EmbyTV.EmbyTV.AddMetadata(IListingsProvider provider, ListingsProviderInfo info, IEnumerable`1 tunerChannels, Boolean enableCache, CancellationToken cancellationToken)
   at Emby.Server.Implementations.LiveTv.EmbyTV.EmbyTV.GetChannelsAsync(Boolean enableCache, CancellationToken cancellationToken)
[2022-02-07 20:22:36.645 +01:00] [INF] [39] Emby.Server.Implementations.LiveTv.LiveTvManager: Refreshing guide with 7 days of guide data
[2022-02-07 20:22:36.646 +01:00] [INF] [39] Emby.Server.Implementations.LiveTv.Listings.XmlTvListingsProvider: xmltv path: "http://192.168.1.8:8888/guia.xml"
[2022-02-07 20:22:36.647 +01:00] [ERR] [39] Emby.Server.Implementations.LiveTv.EmbyTV.EmbyTV: Error adding metadata
System.Xml.XmlException: System does not support 'utf8' encoding. Line 1, position 31.
 ---> System.ArgumentException: 'utf8' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
   at System.Text.EncodingTable.InternalGetCodePageFromName(String name)
   at System.Text.EncodingTable.GetCodePageFromName(String name)

Y no aparece absolutamente nada en la guía de programas, para ningún canal, en ningún día:

image

NOTA: Estoy corriendo la rama no_aiodns

Error en la carga

Hola! me sale un error en la carga utilizando windows 11:

[2022-03-06 18:25:46] [EPG] [INFO] -------------------------
[2022-03-06 18:25:46] [EPG] [INFO] Movistar U7D - EPG v4.8.2
[2022-03-06 18:25:46] [EPG] [INFO] -------------------------
[2022-03-06 18:25:46] [EPG] [INFO] IPTV address: 192.168.1.128
[2022-03-06 18:25:46] [EPG] [WARNING] Missing channels data! Need to download it. Please be patient...
[2022-03-06 18:25:47] [TVG] [INFO] -------------------------
[2022-03-06 18:25:47] [TVG] [INFO] Movistar U7D - TVG v4.8.2
[2022-03-06 18:25:47] [TVG] [INFO] -------------------------
[2022-03-06 18:25:47] [TVG] [INFO] Descargando configuración del cliente
[2022-03-06 18:25:47] [TVG] [INFO] Descargando perfil del servicio
[2022-03-06 18:25:47] [TVG] [INFO] Descargando parámetros de configuración
Traceback (most recent call last):
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts_startup_.py", line 113, in run
File "C:\Users\jmarc\scoop\persist\python\Lib\site-packages\cx_Freeze\initscripts\Console.py", line 15, in run
File "tv_grab_es_movistartv", line 1471, in
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\runners.py", line 44, in run
File "C:\Users\jmarc\scoop\apps\python\current\lib\asyncio\base_events.py", line 641, in run_until_complete
File "tv_grab_es_movistartv", line 1370, in main
File "tv_grab_es_movistartv", line 493, in get_service_config
TypeError: 'NoneType' object is not subscriptable
[2022-03-06 18:25:47] [EPG] [ERROR] Waiting 15s before trying to update EPG again [2/5]

Alguna idea? Gracias

🎯 Docker

Buenas tardes,

He estado revisando el proyecto y tengo que decir que tiene una pinta excelente en concepto y a priori por el funcionamiento que aportas en los videos documentados parece que tiene un funcionamiento sensacional.

UDPXY puedes integrarlo en el docker-compose para hacer el sistema lo más portable posible.

Voy a probarlo aprovechando la gestión de Docker y espero comentar experiencias de uso con el resultado obtenido.

Una duda que parametros debo de poner aquí del fichero de variables:

# docker-compose
IPTV_GW=
U7D_GW=
MAC_IPTV_U7D=
MAC_MOVISTAR_U7D=

¿La puerta de enlace del servidor que corre el docker y la mac?

Porque algo he debido de poner mal en ese apartado ya que me arroja el siguiente error:

[2021-03-20 20:50:17] [INFO] ---------------------------------------------------
[2021-03-20 20:50:17] [INFO] MovistarTV EPG Grabber
[2021-03-20 20:50:17] [INFO] Parámetros: ['--tvheadend', '/home/MovistarTV.m3u', '--output', '/home/guide.xml']
[2021-03-20 20:50:17] [INFO] ---------------------------------------------------
[2021-03-20 20:50:17] [INFO] Creando caché en /home/.xmltv/cache
[2021-03-20 20:50:17] [INFO] Cookie: no encontrada
[2021-03-20 20:50:17] [DEBUG] Caché: configuración no encontrada
[2021-03-20 20:50:17] [INFO] Descargando configuración del cliente
[2021-03-20 20:50:17] [DEBUG] End Points: buscando
[2021-03-20 20:50:17] [DEBUG] End Points: por defecto
[2021-03-20 20:50:17] [INFO] Descargando pefil del servicio
[2021-03-20 20:50:17] [DEBUG] End Points: buscando
[2021-03-20 20:50:17] [DEBUG] End Points: por defecto
[2021-03-20 20:50:17] [INFO] Descargando parámetros de configuración
[2021-03-20 20:50:17] [DEBUG] End Points: buscando
[2021-03-20 20:50:17] [DEBUG] End Points: por defecto
[2021-03-20 20:50:17] [INFO] tvPackages: UTXCP|UTXGW
[2021-03-20 20:50:17] [INFO] Demarcation: 12
[2021-03-20 20:50:17] [INFO] Nuevos End Points: dict_keys(['epNoCach2', 'epNoCach1', 'epNoCach4', 'epNoCach3', 'epNoCach6', 'epNoCach5', 'epNoCach8', 'epNoCach7', 'epNoCach9', 'epNoCach11', 'epNoCach10'])
[2021-03-20 20:50:17] [INFO] Descargando mapa de géneros
[2021-03-20 20:50:17] [INFO] Buscando el Proveedor de Servicios de Murcia
[2021-03-20 20:50:17] [DEBUG] Caché: datos del Proveedor de Servicios no encontrados
[2021-03-20 20:50:17] [DEBUG] Descargando XML de 239.0.2.129:3937
[2021-03-20 20:50:20] [ERROR] Error al descargar los archivos XML: timeout('timed out')
[2021-03-20 20:50:20] [ERROR] Usando el Proveedor de Servicios por defecto: 239.0.2.150
[2021-03-20 20:50:20] [DEBUG] Descargando XML de 239.0.2.150:3937
[2021-03-20 20:50:23] [ERROR] Error al descargar los archivos XML: timeout('timed out')
[2021-03-20 20:50:23] [DEBUG] Caché: metadatos de la EPG no encontrados
[2021-03-20 20:50:23] [INFO] Descargando canales y paquetes
[2021-03-20 20:50:23] [CRITICAL] TypeError("'NoneType' object is not subscriptable")
Traceback (most recent call last):
  File "/app/tv_grab_es_movistartv", line 1322, in <module>
    xdata = iptv.get_service_provider_data()
  File "/app/tv_grab_es_movistartv", line 878, in get_service_provider_data
    self.__get_epg_data(connection['mcast_grp'], connection['mcast_port'])
  File "/app/tv_grab_es_movistartv", line 869, in __get_epg_data
    'channels': self.__get_channels(xml['2_0']),
TypeError: 'NoneType' object is not subscriptable

Un saludo 👌

Is it still working?

Hi all,

First of all thank you very much for this amazing thing!! I have been wanting something like this for a very long time and I hope this is a project that stays alive for a long time to come, since the web application is a POS that has 480-720 max definition...

Anyhow... I was trying to run this to use my subscription in VLC and enjoy better quality but it seems like the script fails. Is the project still working??

These are my logs

[2023-08-03 22:10:24] [INI] [INFO] Movistar U7D v5.2
[2023-08-03 22:10:24] [INI] [INFO] =================
[2023-08-03 22:10:24] [INI] [INFO] IPTV address: 10.8.0.3
[2023-08-03 22:10:29] [EPG] [INFO] -----------------------
[2023-08-03 22:10:42] [EPG] [INFO] Movistar U7D - EPG v5.2
[2023-08-03 22:10:42] [EPG] [INFO] -----------------------
[2023-08-03 22:10:42] [EPG] [WARNING] Missing channels data! Need to download it. Please be patient...
[2023-08-03 22:10:42] [TVG] [INFO] -----------------------
[2023-08-03 22:10:42] [TVG] [INFO] Movistar U7D - TVG v5.2
[2023-08-03 22:10:42] [TVG] [INFO] -----------------------
[2023-08-03 22:10:42] [TVG] [INFO] tvPackages: UTX50|UTXIG|UTXII|UTXIJ|UTXIK|UTXIL
[2023-08-03 22:10:42] [TVG] [INFO] Demarcation: 19
[2023-08-03 22:10:42] [TVG] [INFO] Buscando el Proveedor de Servicios de Madrid
[2023-08-03 22:10:45] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:10:48] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:41] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:41] [TVG] [CRITICAL] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:44] [EPG] [ERROR] [2/3]...
[2023-08-03 22:11:44] [TVG] [INFO] -----------------------
[2023-08-03 22:11:44] [TVG] [INFO] Movistar U7D - TVG v5.2
[2023-08-03 22:11:44] [TVG] [INFO] -----------------------
[2023-08-03 22:11:44] [TVG] [INFO] tvPackages: UTX50|UTXIG|UTXII|UTXIJ|UTXIK|UTXIL
[2023-08-03 22:11:44] [TVG] [INFO] Demarcation: 19
[2023-08-03 22:11:44] [TVG] [INFO] Buscando el Proveedor de Servicios de Madrid
[2023-08-03 22:11:47] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:50] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:53] [TVG] [ERROR] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:53] [TVG] [CRITICAL] Multicast IPTV de Movistar no detectado
[2023-08-03 22:11:56] [EPG] [ERROR] [3/3]...
[2023-08-03 22:11:56] [TVG] [INFO] -----------------------
[2023-08-03 22:11:56] [TVG] [INFO] Movistar U7D - TVG v5.2
[2023-08-03 22:11:56] [TVG] [INFO] -----------------------
[2023-08-03 22:11:56] [TVG] [INFO] tvPackages: UTX50|UTXIG|UTXII|UTXIJ|UTXIK|UTXIL
[2023-08-03 22:11:56] [TVG] [INFO] Demarcation: 19
[2023-08-03 22:11:56] [TVG] [INFO] Buscando el Proveedor de Servicios de Madrid

tail the log on first time

In start.sh there is a race condition depending on the speed of the start of the services.

tail -f will follow the current file, but of for some reason it's not started yet (because the device it's slow) tail will not work and will crash the container and never start.

Should be
tail -F "${_tvgrab_log}" or with some sleep previously.

comskip not working

I have this error when trying to run comskip
Error loading shared library libavutil.so.56: No such file or directory (needed by /usr/bin/comskip)
Error loading shared library libavformat.so.58: No such file or directory (needed by /usr/bin/comskip)
Error loading shared library libavcodec.so.58: No such file or directory (needed by /usr/bin/comskip)
Error loading shared library libswscale.so.5: No such file or directory (needed by /usr/bin/comskip)

Also when building, I cannot find ffmpeg4-libs so I change it to ffmpeg-libs.
Any idea?

Regads

No encuentra el archivo epg.json

Buenas, lo primero dar las gracias por este aporte que aunque como bien dices, al final acabará todo con DRM, mientras se pueda, aprovecharemos lo que dure.

Lo segundo, he instalado las dependencias con pip3, y al ejecutar el script movistar_epg.py, me sale el siguiente error:

./movistar_epg.py 
[2021-08-24 13:58:16] [17987] [INFO] Goin' Fast @ http://127.0.0.1:8889
[2021-08-24 13:58:16] [17987] [ERROR] Failed to load EPG data [Errno 2] No such file or directory: '/home/jesus/.xmltv/cache/epg.json'
[2021-08-24 13:58:16] [17987] [ERROR] Experienced exception while trying to serve
Traceback (most recent call last):
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/app.py", line 1052, in run
    serve_single(server_settings)
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/server.py", line 749, in serve_single
    serve(**server_settings)
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/server.py", line 599, in serve
    loop.run_until_complete(app._server_event("init", "after"))
  File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/app.py", line 1495, in _server_event
    await self.dispatch(
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/signals.py", line 163, in dispatch
    return await dispatch
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/signals.py", line 133, in _dispatch
    retval = await maybe_coroutine
  File "/home/jesus/.local/lib/python3.8/site-packages/sanic/app.py", line 1382, in _listener
    await maybe_coro
  File "./movistar_epg.py", line 59, in after_server_start
    await reload_epg()
  File "./movistar_epg.py", line 242, in reload_epg
    async with await open_async(epg_data) as f:
  File "/home/jesus/.local/lib/python3.8/site-packages/aiofiles/base.py", line 75, in __aenter__
    self._obj = await self._coro
  File "/home/jesus/.local/lib/python3.8/site-packages/aiofiles/threadpool/__init__.py", line 80, in _open
    f = yield from loop.run_in_executor(executor, cb)
  File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
FileNotFoundError: [Errno 2] No such file or directory: '/home/jesus/.xmltv/cache/epg.json'
[2021-08-24 13:58:16] [17987] [CRITICAL] [Errno 2] No such file or directory: '/home/jesus/.xmltv/cache/epg.json'

No sé si es que hay algo que me falta, pero parece que no encuentra el archivo en un directorio propio del home, que efectivamente, ni existe.

¿Qué me falta por hacer?

Gracias.

movistar_epg.py no es capaz de generar EPG y error 404 al descargar canales

Algo no va bien en movistar_epg.py. He terminado arrancando dos ventanas SSH y ejecutando movistar_epg.py y movistar_u7d.py en cada una de ellas. La salida de movistar_u7d.py parece ser normal, sin embargo, la de movistar_epg.py muestra los siguientes mensajes:

root@pi-u7d:/usr/local/bin# movistar_epg.py
[2022-02-06 13:02:48] [EPG] [INFO]
  ┌────────────────────────────────────────────────────────────────────────┐
  │                             Sanic v21.12.0                             │
  │                   Goin' Fast @ http://127.0.0.1:8889                   │
  ├───────────────────────┬────────────────────────────────────────────────┤
  │                       │     mode: production, single worker            │
  │     ▄███ █████ ██     │   server: sanic                                │
  │    ██                 │   python: 3.9.7                                │
  │     ▀███████ ███▄     │ platform: Linux-5.13.0-1016-raspi-armv7l-with- │
  │                 ██    │           glibc2.34                            │
  │    ████ ████████▀     │ packages: sanic-routing==0.7.2                 │
  │                       │                                                │
  │ Build Fast. Run Fast. │                                                │
  └───────────────────────┴────────────────────────────────────────────────┘

[2022-02-06 13:02:48] [EPG] [WARNING] Sanic is running in PRODUCTION mode. Consider using '--debug' or '--dev' while actively developing your application.
[2022-02-06 13:02:49] [EPG] [INFO] -------------------------
[2022-02-06 13:02:49] [EPG] [INFO] Movistar U7D - EPG v4.6.2
[2022-02-06 13:02:49] [EPG] [INFO] -------------------------
[2022-02-06 13:02:49] [EPG] [INFO] IPTV address: 192.168.1.8
[2022-02-06 13:02:49] [EPG] [WARNING] Missing channels data! Need to download it. Please be patient...
[2022-02-06 13:02:52] [TVG] [INFO] -------------------------
[2022-02-06 13:02:52] [TVG] [INFO] Movistar U7D - TVG v4.6.2
[2022-02-06 13:02:52] [TVG] [INFO] -------------------------
[2022-02-06 13:02:52] [TVG] [INFO] Creando caché en /root/.xmltv/cache
[2022-02-06 13:02:52] [TVG] [INFO] Descargando configuración del cliente
[2022-02-06 13:02:52] [TVG] [INFO] Descargando perfil del servicio
[2022-02-06 13:02:56] [TVG] [INFO] Descargando parámetros de configuración
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1503, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1436, in main
    config = await mtv.get_service_config()
  File "/usr/local/bin/tv_grab_es_movistartv", line 536, in get_service_config
    dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
TypeError: 'NoneType' object is not subscriptable
[2022-02-06 13:02:57] [EPG] [ERROR] Waiting 15s before trying to update EPG again [2/5]
[2022-02-06 13:03:15] [TVG] [INFO] -------------------------
[2022-02-06 13:03:15] [TVG] [INFO] Movistar U7D - TVG v4.6.2
[2022-02-06 13:03:15] [TVG] [INFO] -------------------------
[2022-02-06 13:03:15] [TVG] [INFO] Descargando configuración del cliente
[2022-02-06 13:03:16] [TVG] [INFO] Descargando perfil del servicio
[2022-02-06 13:03:21] [TVG] [INFO] Descargando parámetros de configuración
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1503, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1436, in main
    config = await mtv.get_service_config()
  File "/usr/local/bin/tv_grab_es_movistartv", line 536, in get_service_config
    dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
TypeError: 'NoneType' object is not subscriptable
[2022-02-06 13:03:26] [EPG] [ERROR] Waiting 15s before trying to update EPG again [3/5]
[2022-02-06 13:03:44] [TVG] [INFO] -------------------------
[2022-02-06 13:03:44] [TVG] [INFO] Movistar U7D - TVG v4.6.2
[2022-02-06 13:03:44] [TVG] [INFO] -------------------------
[2022-02-06 13:03:44] [TVG] [INFO] Descargando configuración del cliente
[2022-02-06 13:03:44] [TVG] [INFO] Descargando perfil del servicio
[2022-02-06 13:03:48] [TVG] [INFO] Descargando parámetros de configuración
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1503, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1436, in main
    config = await mtv.get_service_config()
  File "/usr/local/bin/tv_grab_es_movistartv", line 536, in get_service_config
    dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
TypeError: 'NoneType' object is not subscriptable
[2022-02-06 13:03:53] [EPG] [ERROR] Waiting 15s before trying to update EPG again [4/5]
[2022-02-06 13:04:11] [TVG] [INFO] -------------------------
[2022-02-06 13:04:11] [TVG] [INFO] Movistar U7D - TVG v4.6.2
[2022-02-06 13:04:11] [TVG] [INFO] -------------------------
[2022-02-06 13:04:11] [TVG] [INFO] Descargando configuración del cliente
[2022-02-06 13:04:11] [TVG] [INFO] Descargando perfil del servicio
[2022-02-06 13:04:12] [TVG] [INFO] Descargando parámetros de configuración
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1503, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1436, in main
    config = await mtv.get_service_config()
  File "/usr/local/bin/tv_grab_es_movistartv", line 536, in get_service_config
    dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
TypeError: 'NoneType' object is not subscriptable
[2022-02-06 13:04:18] [EPG] [ERROR] Waiting 15s before trying to update EPG again [5/5]
[2022-02-06 13:04:36] [TVG] [INFO] -------------------------
[2022-02-06 13:04:36] [TVG] [INFO] Movistar U7D - TVG v4.6.2
[2022-02-06 13:04:36] [TVG] [INFO] -------------------------
[2022-02-06 13:04:36] [TVG] [INFO] Descargando configuración del cliente
[2022-02-06 13:04:36] [TVG] [INFO] Descargando perfil del servicio
[2022-02-06 13:04:41] [TVG] [INFO] Descargando parámetros de configuración
/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "/usr/local/bin/tv_grab_es_movistartv", line 1503, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/local/bin/tv_grab_es_movistartv", line 1436, in main
    config = await mtv.get_service_config()
  File "/usr/local/bin/tv_grab_es_movistartv", line 536, in get_service_config
    dvb_entry_point = platform["dvbConfig"]["dvbipiEntryPoint"].split(":")
TypeError: 'NoneType' object is not subscriptable
[2022-02-06 13:04:41] [EPG] [ERROR] Waiting 15s before trying to update EPG again [6/5]
[2022-02-06 13:04:56] [EPG] [INFO] Waiting 3304s to start updating EPG...
[2022-02-06 13:04:57] [EPG] [INFO] Starting worker [1285]

Terminan los 5 intentos y no termina de descargar nada.

He probado a mover los ficheros MovistarTV.m3u, guide.xml y guide.xml.gz y el directorio oculto .xmltv, generados con la versión anterior, para ver si se genera algo con la nueva versión, y lo único que aparece es la estructura de directorios dentro del oculto .xmltv/cache/programs, pero nada dentro de ninguno de ellos (completamente vacíos).

¿Alguna idea?

Instalación en debian...

Por favor revisar instalacion en debian... no funciona...

Imagino que hay que tocar la IP adaptando a la IP del servidor...
Imagino que hay que hacer un chmod +x para poder ejecutar...

Pero algo más falla...

 movistar_epg.service - Movistar U7D - EPG State service
     Loaded: loaded (/etc/systemd/system/movistar_epg.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2021-11-14 18:53:56 UTC; 3s ago
    Process: 7417 ExecStart=/usr/local/bin/movistar_epg.py (code=exited, status=1/FAILURE)
   Main PID: 7417 (code=exited, status=1/FAILURE)
        CPU: 382ms

Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:   File "/usr/lib/python3.9/asyncio/subprocess.py", line 236, in create_subprocess_exec
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:     transport, protocol = await loop.subprocess_exec(
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:   File "uvloop/loop.pyx", line 2793, in subprocess_exec
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:   File "uvloop/loop.pyx", line 2751, in __subprocess_run
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:   File "uvloop/handles/process.pyx", line 597, in uvloop.loop.UVProcessTransport.new
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]:   File "uvloop/handles/process.pyx", line 99, in uvloop.loop.UVProcess._init
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]: PermissionError: [Errno 13] Permission denied
Nov 14 18:53:56 MovistarTV movistar_epg.py[7417]: [2021-11-14 18:53:56] [7417] [CRITICAL] PermissionError(13, 'Permission denied')
Nov 14 18:53:56 MovistarTV systemd[1]: movistar_epg.service: Main process exited, code=exited, status=1/FAILURE
Nov 14 18:53:56 MovistarTV systemd[1]: movistar_epg.service: Failed with result 'exit-code'.

Se ejecuto el .py directamente... me saltan incluso mas errores...

root@MovistarTV:/# python3 /usr/local/bin/movistar_epg.py
[2021-11-14 19:17:58] [536] [INFO]
  ┌─────────────────────────────────────────────────────────────────────────────┐
  │                              Sanic v21.12.0dev                              │
  │                      Goin' Fast @ http://127.0.0.1:8889                     │
  ├───────────────────────┬─────────────────────────────────────────────────────┤
  │                       │     mode: production, single worker                 │
  │     ▄███ █████ ██     │   server: sanic                                     │
  │    ██                 │   python: 3.9.2                                     │
  │     ▀███████ ███▄     │ platform: Linux-5.11.22-5-pve-x86_64-with-glibc2.31 │
  │                 ██    │ packages: sanic-routing==0.7.2                      │
  │    ████ ████████▀     │                                                     │
  │                       │                                                     │
  │ Build Fast. Run Fast. │                                                     │
  └───────────────────────┴─────────────────────────────────────────────────────┘

[2021-11-14 19:17:58] [536] [WARNING] Sanic is running in PRODUCTION mode. Consider using '--debug' or '--dev' while actively developing your application.
[2021-11-14 19:17:58] [536] [WARNING] Missing channels data!. Need to download it. Please be patient...
[2021-11-14 19:17:58] [536] [ERROR] Experienced exception while trying to serve
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1100, in run
    serve_single(server_settings)
  File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 199, in serve_single
    serve(**server_settings)
  File "/usr/local/lib/python3.9/dist-packages/sanic/server/runners.py", line 147, in serve
    loop.run_until_complete(app._server_event("init", "after"))
  File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
  File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1650, in _server_event
    await self.dispatch(
  File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 163, in dispatch
    return await dispatch
  File "/usr/local/lib/python3.9/dist-packages/sanic/signals.py", line 133, in _dispatch
    retval = await maybe_coroutine
  File "/usr/local/lib/python3.9/dist-packages/sanic/app.py", line 1426, in _listener
    await maybe_coro
  File "/usr/local/bin/movistar_epg.py", line 82, in after_server_start
    await reload_epg()
  File "/usr/local/bin/movistar_epg.py", line 415, in reload_epg
    await update_epg()
  File "/usr/local/bin/movistar_epg.py", line 712, in update_epg
    tvgrab = await asyncio.create_subprocess_exec(
  File "/usr/lib/python3.9/asyncio/subprocess.py", line 236, in create_subprocess_exec
    transport, protocol = await loop.subprocess_exec(
  File "uvloop/loop.pyx", line 2793, in subprocess_exec
  File "uvloop/loop.pyx", line 2751, in __subprocess_run
  File "uvloop/handles/process.pyx", line 597, in uvloop.loop.UVProcessTransport.new
  File "uvloop/handles/process.pyx", line 99, in uvloop.loop.UVProcess._init
PermissionError: [Errno 13] Permission denied
[2021-11-14 19:17:58] [536] [CRITICAL] PermissionError(13, 'Permission denied')
root@MovistarTV:/#

Error: http://LAN_IP:8888/{canal}/live - 404 Not found

Sigo intentando poner en marcha tu proyecto en una Raspberry Pi 4 con Ubuntu Server 20.10 de 64bits.

Después de tus correcciones en sanic-prometeus, ahora el microservicio de la EPG funciona bien. Sin embargo el proxy para reproducir canales no. Si por ejemplo en el reproductor VLC introduzco la url http://192.168.1.8:8888/4455/live (correspondiente a La2), no me aparece ningún stream.

El registro en /var/log/syslog de esa consulta es el siguiente:

Jan  6 00:56:15 pi-u7d movistar_u7d.py[1813]: [2022-01-06 00:56:15] [1813] [ERROR] /4455/live not found
Jan  6 00:56:15 pi-u7d movistar_u7d.py[1813]: [2022-01-06 00:56:15] [1813] [ERROR] /4455/live not found

image

En este caso no tengo ni idea de por donde empezar a tirar del hilo...

Alerta en MAC Docker - IPTV de Movistar no detectado

Hola, al compilar en mac con docker todo se ejecuta correctamente, estoy conectado a mi red wifi de movistar con fibra y modem de movistar (tengo todos los servicios de movistar hogar fibra)

pero los mensajes me muestra lo siguiente:
movistar_u7d | [2024-05-19 01:53:58] [INI] [INFO] =================
movistar_u7d | [2024-05-19 01:53:58] [INI] [INFO] Movistar U7D v5.2
movistar_u7d | [2024-05-19 01:53:58] [INI] [INFO] =================
movistar_u7d | [2024-05-19 01:53:58] [INI] [INFO] IPTV address: 192.168.64.2
movistar_u7d | [2024-05-19 01:53:59] [EPG] [INFO] -----------------------
movistar_u7d | [2024-05-19 01:53:59] [EPG] [INFO] Movistar U7D - EPG v5.2
movistar_u7d | [2024-05-19 01:53:59] [EPG] [INFO] -----------------------
movistar_u7d | [2024-05-19 01:53:59] [EPG] [WARNING] Missing channels data! Need to download it. Please be patient...
movistar_u7d | [2024-05-19 01:54:00] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 01:54:00] [TVG] [INFO] Movistar U7D - TVG v5.2
movistar_u7d | [2024-05-19 01:54:00] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 01:54:00] [TVG] [INFO] Creando caché en /home/.xmltv/cache
movistar_u7d | [2024-05-19 01:54:00] [TVG] [INFO] Descargando configuración del cliente, parámetros de configuración y perfil del servicio
movistar_u7d | [2024-05-19 02:19:04] [TVG] [CRITICAL] IPTV de Movistar no detectado
movistar_u7d | [2024-05-19 02:19:07] [EPG] [ERROR] [2/3]...
movistar_u7d | [2024-05-19 02:19:08] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 02:19:08] [TVG] [INFO] Movistar U7D - TVG v5.2
movistar_u7d | [2024-05-19 02:19:08] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 02:19:08] [TVG] [INFO] Descargando configuración del cliente, parámetros de configuración y perfil del servicio
movistar_u7d | [2024-05-19 02:44:11] [TVG] [CRITICAL] IPTV de Movistar no detectado
movistar_u7d | [2024-05-19 02:44:14] [EPG] [ERROR] [3/3]...
movistar_u7d | [2024-05-19 02:44:14] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 02:44:14] [TVG] [INFO] Movistar U7D - TVG v5.2
movistar_u7d | [2024-05-19 02:44:14] [TVG] [INFO] -----------------------
movistar_u7d | [2024-05-19 02:44:14] [TVG] [INFO] Descargando configuración del cliente, parámetros de configuración y perfil del servicio

-----> IPTV de Movistar no detectado ? (que me falta configurar para acceder a los canales),
gracias de antemano, agradeceria una ayuda

Error abrir u7d en Tivimate

Buenas tardes
Lo primero, agradecer tu trabajo!
Hoy me decidi a probar tu script con tivimate, y los canales en live me los abre sin problema. (si no tiene DRM, claro... Algo con lo que ya estoy peleando xD)

El problema es cuando quiero ver una emisión pasada.
Seleccione un programa anterior en tivimate, pero veo en la consola del pc que el script intenta arrancar el archivo en cuestión pero automáticamente se pone en stop, vuelve a intentarlo varias veces sin éxito.

A alguien más le pasa lo mismo? Alguna solución?

Gracias de nuevo. Un saludo

Canales encriptados

Tan solo puedo ver un par de canales de Movistar+
La 2 HD, Antena 3 HD, Cuatro HD ,Tele 5 HD, laSexta HD, Paramount Network, Be Mad HD, TRECE, Neox HD, Atreseries HD, GOL PLAY HD, Teledeporte HD, Real Madrid TV HD, DMAX, DKISS, Nova HD, MEGA HD, Ten, Disney Channel HD, Clan TVE HD, El Toro TV HD, Portada HD

  • Usando Docker, únicamente con el archivo docker-compose.yml (sin archivos .conf)

Los logs, que yo creo que son más relevantes, dicen lo siguiente:

movistar_u7d  | [2024-04-16 16:53:27] [TVG] [INFO] M3U: Saltando canal encriptado "La 1 HD" 4917
...
movistar_u7d  | [2024-04-16 16:57:05] [TVG] [INFO] Canales con EPG: 246
movistar_u7d  | [2024-04-16 16:57:05] [TVG] [INFO] Conservando 21 canales en abierto
movistar_u7d  | [2024-04-16 16:57:05] [TVG] [INFO] Comprobando si el nuevo EPG necesita arreglos...
movistar_u7d  | [2024-04-16 16:57:05] [TVG] [INFO] Nuevo EPG sin errores
movistar_u7d  | [2024-04-16 16:57:05] [TVG] [INFO] Comprobando si el EPG resultante necesita arreglos...
movistar_u7d  | Traceback (most recent call last):
movistar_u7d  |   File "/app/movistar_tvg.py", line 1408, in <module>
movistar_u7d  |     asyncio.run(tvg_main())
movistar_u7d  |   File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
movistar_u7d  |     return loop.run_until_complete(main)
movistar_u7d  |   File "/usr/local/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
movistar_u7d  |     return future.result()
movistar_u7d  |   File "/app/movistar_tvg.py", line 1335, in tvg_main
movistar_u7d  |     epg, cached = await iptv.get_epg()
movistar_u7d  |   File "/app/movistar_tvg.py", line 1007, in get_epg
movistar_u7d  |     cached_epg, broken, fixed = self.fix_epg(new_epg, cached_epg, broken, fixed)
movistar_u7d  |   File "/app/movistar_tvg.py", line 918, in fix_epg
movistar_u7d  |     if prev_end > timestamp:
movistar_u7d  | TypeError: '>' not supported between instances of 'int' and 'str'
movistar_u7d  | [2024-04-16 16:57:08] [EPG] [ERROR] [2/3]...
movistar_u7d  | [2024-04-16 16:57:09] [TVG] [INFO] -----------------------
movistar_u7d  | [2024-04-16 16:57:09] [TVG] [INFO] Movistar U7D - TVG v5.2
movistar_u7d  | [2024-04-16 16:57:09] [TVG] [INFO] -----------------------
movistar_u7d  | [2024-04-16 16:57:09] [TVG] [INFO] tvPackages: UTXC8|UTXCG
...
movistar_u7d  | [2024-04-16 17:01:35] [TVG] [INFO] Canales con EPG: 246
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Conservando 21 canales en abierto
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Comprobando si el nuevo EPG necesita arreglos...
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Nuevo EPG sin errores
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Comprobando si el EPG resultante necesita arreglos...
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Eventos: Arreglados = 0 _ Caducados = 0 _ Descartados = 0
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] Generando la guía XMLTV...
movistar_u7d  | [2024-04-16 17:01:36] [TVG] [INFO] XML: Descargando info extendida
movistar_u7d  | [2024-04-16 17:01:48] [TVG] [INFO] EPG de 21 canales y 8 días descargada en 0:04:39s
movistar_u7d  | [2024-04-16 17:01:49] [EPG] [INFO] Channels & EPG Updated => http://192.168.1.69:8888/MovistarTV.m3u - http://192.168.1.69:8888/guide.xml.gz
movistar_u7d  | [2024-04-16 17:01:49] [EPG] [INFO] No cloud recordings found
movistar_u7d  | [2024-04-16 17:01:49] [EPG] [INFO] Total: 21 Channels & 6047 EPG entries
movistar_u7d  | [2024-04-16 17:01:50] [U7D] [INFO] -----------------------
movistar_u7d  | [2024-04-16 17:01:50] [U7D] [INFO] Movistar U7D - U7D v5.2
movistar_u7d  | [2024-04-16 17:01:50] [U7D] [INFO] -----------------------

He probado también el docker-compose.yml de la branch "next", pero ahora devuelve una lista de canales .m3u no reproducibles por VLC.

  • ¿Hay alguna solución para ver todos los canales (contratados)? Entiendo que se pueden ver tan solo los canales que tienes contratados y que se pueden visualizar mediante la decodificación de la cajita de movistarTV.
  • Otra duda que tengo es que el archivo .m3u contiene enlaces como xxxx.movistar.tv . Por curiosidad he entrado a esta web y tan solo redirige a páginas de anuncios. ¿Por qué está este enlace ahí?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.