From 9908271e9d0ecdd7d51d32b697fcc67464bdd777 Mon Sep 17 00:00:00 2001
From: Paco8 <5084042+Paco8@users.noreply.github.com>
Date: Mon, 27 Feb 2023 15:50:32 +0100
Subject: [PATCH] Version 0.6.5
---
README.md | 38 ++++++++--------
addon.xml | 2 +-
.../resource.language.en_gb/strings.po | 28 ++++++++++++
.../resource.language.es_es/strings.po | 24 ++++++++++
resources/lib/movistar.py | 37 +++++++++++-----
resources/lib/plugin.py | 11 ++---
resources/settings.xml | 13 +++++-
service.py | 44 +++++++++++++++++++
8 files changed, 158 insertions(+), 39 deletions(-)
diff --git a/README.md b/README.md
index 26858d5..8d0b673 100644
--- a/README.md
+++ b/README.md
@@ -69,31 +69,31 @@ El plugin modifica los subtítulos de la TV a la carta para que aparezcan correc
---
## Soporte para IPTV
-Se ha añadido soporte para IPTV Manager. Esto permite ver los canales en un entorno más parecido a un receptor de TV, y hacer zapping con los botones arriba y abajo y OK. Unas capturas:
+Opcionalmente es posible configurar el plugin para IPTV. Esto permite ver los canales en un entorno más parecido a un receptor de TV, y hacer zapping con los botones arriba y abajo y OK. Unas capturas:
-A continuación van las instrucciones para configurarlo, pero **todo esto es opcional, el addon se puede usar perfectamente sin IPTV**.
+A continuación van las instrucciones para configurarlo. Es necesario instalar el plugin `IPTV Simple Client`. Se encargará de mostrar los canales y la guía en el apartado TV de Kodi.
+Este plugin lo puedes encontrar en Addons, Mis addons, Clientes PVR, con el nombre **PVR IPTV Simple Client**. En el caso de que ya estuviera instalado pero desactivarlo hay que activarlo.
-Es necesario instalar y configurar otros dos addons: ITPV Manager y IPTV Simple Client. El primero se ocupará de obtener periódicamente el listado de canales de Movistarplus y la programación de los canales, y se la proporcionará a IPTV Simple Client, que es el addon que se encarga de mostrar los canales y la guía en la sección TV de Kodi.
+Una vez instalado IPTV Simple Client vamos a los ajustes de Movistarplus.
-- Abre los ajustes del addon y ve a la sección "IPTV Manager".
-- Selecciona la opción "Instalar IPTV Manager". Acepta el diálogo para instalar el addon y sus dependencias.
-- Vuelve a los ajustes Movistarplus, sección "IPTV Manager" y activa la opción "Habilitar integración con IPTV Manager".
-- Selecciona la opción "Opciones de IPTV Manager".
-- En la nueva ventana selecciona la sección "IPTV Simple" y dale a "Configure IPTV Simple automatically".
-- Ve a la sección "Channels" y selecciona "Refresh channels and guide now".
+- En la sección **IPTV** activamos la opción **Exportar automáticamente canales y guía para IPTV**.
+- En la opción **Guardar en esta carpeta** tenemos que seleccionar una carpeta donde se guardará esa información. Puedes usar la carpeta `download` o cualquier otra, o crear una nueva.
+- Hecho esto salimos de Kodi y volvemos a entrar.
+- Esperamos unos segundos hasta que aparezca una notificación en la parte superior izquierda indicando que Movistarplus ha exportado los canales y la guía.
+- Entramos otra vez en los ajustes de Movistarplus.
+- En la sección **IPTV** seleccionamos **Abrir la configuración de IPTV Simple**.
+- (**Kodi 20**) Seleccionamos "Añadir configuración de Addon". En nombre le ponemos por ejemplo `Movistarplus`.
+- En la nueva ventana que se abre seleccionamos en Ubicación "Local path".
+- En "Ruta a la lista M3U" nos vamos a la carpeta que habíamos elegido para exportar los datos de Movistarplus y seleccionamos el fichero `movistar-channels.m3u8`
+- Ahora vamos a la sección **EPG**, y en Ubucación seleccionamos "Local path".
+- En "Ruta XMLTV" nos vamos a la carpeta que habíamos elegido para exportar los datos de Movistarplus y seleccionamos el fichero `movistar-epg.xml`
+- (Opcionalmente) En la sección **Catchup** activamos la opción "Enable catchup".
+- Aceptamos los cambios.
+- (**Kodi 20**) Cuando vuelva a salir otra vez la ventana "Ajustes y configuraciones de Addon" pulsamos en Cancelar.
+- Reiniciamos Kodi.
Si todo ha ido bien ahora en la sección TV de Kodi podrás acceder a los canales y a la guía de Movistarplus.
-**NOTA sobre Kodi 20**
-
-En el momento de escribir estas líneas la configuración automática de **IPTV Simple** no se realiza correctamente en Kodi 20, debidos a cambios en este addon. Y hay que realizarla a mano:
-
-- Entra en los ajustes del addon IPTV Manager y selecciona la opción "IPTV Simple".
-- Dale a la opción "Open IPTV Simple settings".
-- En la nueva ventana, en Ubicación seleciona "Ruta remota".
-- En la opción "URL a la lista M3U", introduce esto: `special://profile/addon_data/service.iptv.manager/playlist.m3u8`
-- En la sección "Opciones EPG", en Ubicación selecciona "Ruta remota".
-- En "URL XMLTV" introduce esto: `special://profile/addon_data/service.iptv.manager/epg.xml`
diff --git a/addon.xml b/addon.xml
index 01ba1c5..d8c0a95 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,7 +1,7 @@
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index 670eb36..0205547 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -288,3 +288,31 @@ msgstr ""
msgctxt "#30303"
msgid "IPTV Manager settings"
msgstr ""
+
+msgctxt "#30304"
+msgid "IPTV"
+msgstr ""
+
+msgctxt "#30305"
+msgid "Export channels and EPG for IPTV automatically"
+msgstr ""
+
+msgctxt "#30306"
+msgid "Save to this folder (requires restart)"
+msgstr ""
+
+msgctxt "#30307"
+msgid "Install IPTV Simple add-on"
+msgstr ""
+
+msgctxt "#30308"
+msgid "Open IPTV Simple settings"
+msgstr ""
+
+msgctxt "#30310"
+msgid "Exporting channels"
+msgstr ""
+
+msgctxt "#30311"
+msgid "Exporting EPG"
+msgstr ""
diff --git a/resources/language/resource.language.es_es/strings.po b/resources/language/resource.language.es_es/strings.po
index decb923..2bc172a 100644
--- a/resources/language/resource.language.es_es/strings.po
+++ b/resources/language/resource.language.es_es/strings.po
@@ -288,3 +288,27 @@ msgstr "Habilitar integración con IPTV Manager"
msgctxt "#30303"
msgid "IPTV Manager settings"
msgstr "Opciones de IPTV Manager"
+
+msgctxt "#30305"
+msgid "Export channels and EPG for IPTV automatically"
+msgstr "Exportar automáticamente canales y guía para IPTV"
+
+msgctxt "#30306"
+msgid "Save to this folder (requires restart)"
+msgstr "Guardar en esta carpeta (requiere reinicio)"
+
+msgctxt "#30307"
+msgid "Install IPTV Simple add-on"
+msgstr "Instalar el addon IPTV Simple"
+
+msgctxt "#30308"
+msgid "Open IPTV Simple settings"
+msgstr "Abrir la configuración de IPTV Simple"
+
+msgctxt "#30310"
+msgid "Exporting channels"
+msgstr "Exportando canales"
+
+msgctxt "#30311"
+msgid "Exporting EPG"
+msgstr "Exportando guía"
diff --git a/resources/lib/movistar.py b/resources/lib/movistar.py
index d3fa59d..5285c97 100644
--- a/resources/lib/movistar.py
+++ b/resources/lib/movistar.py
@@ -1021,13 +1021,13 @@ class Movistar(object):
from urllib.parse import urlencode
else:
from urllib import urlencode
- now = time.time()*1000
+ #now = time.time()*1000
res = {}
epg = self.get_epg()
channels = self.get_channels(False)
for channel in channels:
- if not channel['subscribed']: continue
id = channel['id']
+ if not channel['subscribed'] or not id in epg: continue
res[id] = []
for e in epg[id]:
t = {}
@@ -1036,8 +1036,9 @@ class Movistar(object):
t['start'] = datetime.utcfromtimestamp(e['start']/1000).strftime('%Y-%m-%dT%H:%M:%SZ')
t['stop'] = datetime.utcfromtimestamp(e['end']/1000).strftime('%Y-%m-%dT%H:%M:%SZ')
- aired = (e['end'] <= now)
- if aired:
+ #aired = (e['end'] <= now)
+ #if aired:
+ if True:
program_id = str(e['show_id'])
url = 'https://grmovistar.imagenio.telefonica.net/asfe/rest/tvMediaURLs?tvProgram.id='+ program_id +'&svc=startover'
session_request = '{"contentID":' + program_id +',"streamType":"CUTV"}'
@@ -1076,19 +1077,31 @@ class Movistar(object):
epg = self.export_epg()
for ch in channels:
+ if not ch['id'] in epg: continue
for e in epg[ch['id']]:
start = datetime.strptime(e['start'], "%Y-%m-%dT%H:%M:%SZ").strftime("%Y%m%d%H%M%S +0000")
stop = datetime.strptime(e['stop'], "%Y-%m-%dT%H:%M:%SZ").strftime("%Y%m%d%H%M%S +0000")
url = e.get('stream', None)
if url:
- url = url.replace('&', '&')
- res.append('\n' +
- ' {}\n'.format(e['title']) +
- ' {}'.format(e['subtitle']) +
- '\n')
-
+ url = url.replace('&', '&')
+ res.append('\n' +
+ ' {}\n'.format(e['title']) +
+ ' {}\n'.format(e['subtitle']))
+ if 'image' in e:
+ res.append(' \n'.format(e['image']))
+ if 'description' in e:
+ res.append(' {}\n'.format(e['description']))
+ if 'credits' in e and len(e['credits']) > 0:
+ res.append(' \n');
+ for c in e['credits']:
+ if c['type'] == 'director':
+ res.append(' {}\n'.format(c['name']))
+ elif c['type'] == 'actor':
+ res.append(' {}\n'.format(c['name']))
+ res.append(' \n');
+ res.append('\n')
res.append('\n')
with io.open(filename, 'w', encoding='utf-8', newline='') as handle:
handle.write(''.join(res))
diff --git a/resources/lib/plugin.py b/resources/lib/plugin.py
index 3117da3..eb3800c 100644
--- a/resources/lib/plugin.py
+++ b/resources/lib/plugin.py
@@ -237,8 +237,8 @@ def add_videos(category, ctype, videos, ref=None, url_next=None, url_prev=None):
list_item.setInfo('video', t['info'])
list_item.setArt(t['art'])
- if t.get('stream_type') == 'u7d' and not t.get('aired', False):
- record_program_action = (addon.getLocalizedString(30171), "RunPlugin(" + get_url(action='add_recording', id=t['id']) + ")")
+ if t.get('stream_type') == 'u7d' and 'show_id' in t and not t.get('aired', False):
+ record_program_action = (addon.getLocalizedString(30171), "RunPlugin(" + get_url(action='add_recording', id=t['show_id']) + ")")
list_item.addContextMenuItems([record_program_action])
if 'rec' in t:
@@ -478,15 +478,16 @@ def list_users():
def iptv(params):
LOG('iptv: params: {}'.format(params))
if m.logged:
- try:
+ #try:
+ if True:
from .iptvmanager import IPTVManager
port = int(params['port'])
if params['action'] == 'iptv-channels':
IPTVManager(port).send_channels(m)
elif params['action'] == 'iptv-epg':
IPTVManager(port).send_epg(m)
- except:
- pass
+ #except:
+ # pass
def router(paramstring):
"""
diff --git a/resources/settings.xml b/resources/settings.xml
index 6d5314f..30fdf7a 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -6,8 +6,8 @@
-
-
+
+
@@ -21,12 +21,21 @@
-->
+
+
+
+
+
+
+
diff --git a/service.py b/service.py
index 12199a9..590f954 100644
--- a/service.py
+++ b/service.py
@@ -5,11 +5,49 @@ from __future__ import unicode_literals
import os
import xbmc
+import xbmcgui
from resources.lib.proxy import Proxy
from resources.lib.addon import *
from resources.lib.log import LOG
from resources.lib.cache import Cache
+def export_epg():
+ from datetime import datetime, timedelta
+ from resources.lib.gui import show_notification
+
+ def needs_update(filename):
+ if os.path.exists(filename):
+ file_modification_time = datetime.fromtimestamp(os.path.getmtime(filename))
+ return datetime.now() - file_modification_time > timedelta(hours=6)
+ return True
+
+ folder = addon.getSetting('epg_folder')
+ if sys.version_info[0] > 2:
+ folder = bytes(folder, 'utf-8')
+ LOG('folder for channels and epg: {}'.format(folder))
+ if not folder or not os.path.isdir(folder): return
+
+ channels_filename = os.path.join(folder, b"movistar-channels.m3u8")
+ epg_filename = os.path.join(folder, b"movistar-epg.xml")
+ LOG('channels filename: {}'.format(channels_filename))
+ LOG('epg filename: {}'.format(epg_filename))
+
+ channels_needs_update = needs_update(channels_filename)
+ epg_needs_update = needs_update(epg_filename)
+ LOG('channels_needs_update: {} epg_needs_update: {}'.format(channels_needs_update, epg_needs_update))
+
+ if channels_needs_update or epg_needs_update:
+ from resources.lib.movistar import Movistar
+ reuse_devices = addon.getSettingBool('reuse_devices')
+ m = Movistar(profile_dir, reuse_devices)
+ if not m.logged: return
+ if channels_needs_update:
+ show_notification(addon.getLocalizedString(30310), xbmcgui.NOTIFICATION_INFO)
+ m.export_channels_to_m3u8(channels_filename)
+ if epg_needs_update:
+ show_notification(addon.getLocalizedString(30311), xbmcgui.NOTIFICATION_INFO)
+ m.export_epg_to_xml(epg_filename)
+
if __name__ == '__main__':
LOG('Service started')
proxy = Proxy()
@@ -18,6 +56,12 @@ if __name__ == '__main__':
cache = Cache(profile_dir)
cache.save_file('proxy.conf', proxy.proxy_address)
+ if addon.getSettingBool('export_epg'):
+ try:
+ export_epg()
+ except:
+ pass
+
monitor = xbmc.Monitor()
while not monitor.abortRequested():
if monitor.waitForAbort(1):