Version 0.7.13

This commit is contained in:
Paco8 committed 2023-09-27 15:15:47 +02:00
1 parent 95f540c0fe
commit 428388825c
24 files changed
+287 -24

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.movistarplus" <addon id="plugin.video.movistarplus"
name="Movistar+" name="Movistar+"
version="0.7.12" version="0.7.13"
provider-name="Paco8"> provider-name="Paco8">
<requires> <requires>
<!--- <import addon="xbmc.python" version="2.25.0"/> --> <!--- <import addon="xbmc.python" version="2.25.0"/> -->
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

@@ -29,6 +29,10 @@ msgctxt "#30003"
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
msgctxt "#30004"
msgid "Subtitles"
msgstr ""
# For Orange and Movistar only # For Orange and Movistar only
msgctxt "#30010" msgctxt "#30010"
msgid "DRM type" msgid "DRM type"
@@ -95,6 +99,10 @@ msgctxt "#30025"
msgid "Send video progress to provider's server" msgid "Send video progress to provider's server"
msgstr "" msgstr ""
msgctxt "#30026"
msgid "Update interval (in seconds)"
msgstr ""
# For SkyOTT only # For SkyOTT only
msgctxt "#30031" msgctxt "#30031"
msgid "Streaming service" msgid "Streaming service"
@@ -132,7 +140,7 @@ msgstr ""
# For SkyOTT only # For SkyOTT only
msgctxt "#30040" msgctxt "#30040"
msgid "Use only for these languages (e.g.: es en pt):" msgid "Use for these languages (e.g.: es en pt):"
msgstr "" msgstr ""
# For SkyOTT only # For SkyOTT only
@@ -140,6 +148,11 @@ msgctxt "#30041"
msgid "Subscription country (two letter code):" msgid "Subscription country (two letter code):"
msgstr "" msgstr ""
# For SkyOTT only
msgctxt "#30050"
msgid "Remember username and password"
msgstr ""
msgctxt "#30101" msgctxt "#30101"
msgid "Menu" msgid "Menu"
msgstr "" msgstr ""
@@ -274,6 +287,15 @@ msgctxt "#30167"
msgid "Edit account" msgid "Edit account"
msgstr "" msgstr ""
msgctxt "#30168"
msgid "Login successful"
msgstr ""
# For Orange and Movistar only
msgctxt "#30169"
msgid "Record season"
msgstr ""
# For Orange and Movistar only # For Orange and Movistar only
msgctxt "#30170" msgctxt "#30170"
msgid "Play from the beginning" msgid "Play from the beginning"
@@ -315,6 +337,10 @@ msgctxt "#30178"
msgid "Title removed from my list" msgid "Title removed from my list"
msgstr "" msgstr ""
msgctxt "#30179"
msgid "Remove from continue watching"
msgstr ""
msgctxt "#30180" msgctxt "#30180"
msgid "Profiles" msgid "Profiles"
msgstr "" msgstr ""
@@ -347,6 +373,18 @@ msgctxt "#30187"
msgid "Select the cookie file" msgid "Select the cookie file"
msgstr "" msgstr ""
msgctxt "#30190"
msgid "Login to {} with a key file"
msgstr ""
msgctxt "#30191"
msgid "Login to {} with username"
msgstr ""
msgctxt "#30192"
msgid "Use a {} account"
msgstr ""
msgctxt "#30200" msgctxt "#30200"
msgid "Error" msgid "Error"
msgstr "" msgstr ""
@@ -448,3 +486,19 @@ msgstr ""
msgctxt "#30321" msgctxt "#30321"
msgid "Show age rating before playback" msgid "Show age rating before playback"
msgstr "" msgstr ""
msgctxt "#30400"
msgid "{} days remaining"
msgstr ""
msgctxt "#30401"
msgid "{} hours remaining"
msgstr ""
msgctxt "#30450"
msgid "Buy the developer a coffee"
msgstr ""
msgctxt "#30451"
msgid "If you find this addon useful you can buy the developer a coffee:"
msgstr ""
@@ -12,7 +12,7 @@ msgstr ""
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"Language: en\n" "Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -29,6 +29,10 @@ msgctxt "#30003"
msgid "Experimental" msgid "Experimental"
msgstr "Experimental" msgstr "Experimental"
msgctxt "#30004"
msgid "Subtitles"
msgstr "Subtítulos"
msgctxt "#30010" msgctxt "#30010"
msgid "DRM type" msgid "DRM type"
msgstr "Tipo de DRM" msgstr "Tipo de DRM"
@@ -85,6 +89,10 @@ msgctxt "#30025"
msgid "Send video progress to provider's server" msgid "Send video progress to provider's server"
msgstr "Enviar progreso al servidor de la plataforma" msgstr "Enviar progreso al servidor de la plataforma"
msgctxt "#30026"
msgid "Update interval (in seconds)"
msgstr "Tiempo entre actualizaciones (en segundos)"
msgctxt "#30031" msgctxt "#30031"
msgid "Streaming service" msgid "Streaming service"
msgstr "Plataforma" msgstr "Plataforma"
@@ -114,15 +122,21 @@ msgctxt "#30037"
msgid "Enable HDCP" msgid "Enable HDCP"
msgstr "Habilitar HDCP" msgstr "Habilitar HDCP"
# For SkyOTT only
msgctxt "#30040" msgctxt "#30040"
msgid "Use only for these languages (e.g.: es en pt):" msgid "Use for these languages (e.g.: es en pt):"
msgstr "Usar solo para estos idiomas (ej: es en pt):" msgstr "Usar para estos idiomas (ej: es en pt):"
# For SkyOTT only # For SkyOTT only
msgctxt "#30041" msgctxt "#30041"
msgid "Subscription country (two letter code):" msgid "Subscription country (two letter code):"
msgstr "País de la suscripción (código de dos letras):" msgstr "País de la suscripción (código de dos letras):"
# For SkyOTT only
msgctxt "#30050"
msgid "Remember username and password"
msgstr "Recordar usuario y clave"
msgctxt "#30101" msgctxt "#30101"
msgid "Menu" msgid "Menu"
msgstr "Menú" msgstr "Menú"
@@ -255,6 +269,15 @@ msgctxt "#30167"
msgid "Edit account" msgid "Edit account"
msgstr "Editar cuenta" msgstr "Editar cuenta"
msgctxt "#30168"
msgid "Login successful"
msgstr "Se ha iniciado sesión"
# For Orange and Movistar only
msgctxt "#30169"
msgid "Record season"
msgstr "Grabar temporada"
msgctxt "#30170" msgctxt "#30170"
msgid "Play from the beginning" msgid "Play from the beginning"
msgstr "Ver desde el principio" msgstr "Ver desde el principio"
@@ -291,6 +314,10 @@ msgctxt "#30178"
msgid "Title removed from my list" msgid "Title removed from my list"
msgstr "Título quitado de mi lista" msgstr "Título quitado de mi lista"
msgctxt "#30179"
msgid "Remove from continue watching"
msgstr "Quitar de seguir viendo"
msgctxt "#30180" msgctxt "#30180"
msgid "Profiles" msgid "Profiles"
msgstr "Perfiles" msgstr "Perfiles"
@@ -323,6 +350,18 @@ msgctxt "#30187"
msgid "Select the cookie file" msgid "Select the cookie file"
msgstr "Selecciona el fichero cookie" msgstr "Selecciona el fichero cookie"
msgctxt "#30190"
msgid "Login to {} with a key file"
msgstr "Iniciar sesión en {} con fichero key"
msgctxt "#30191"
msgid "Login to {} with username"
msgstr "Iniciar sesión en {} con nombre y clave"
msgctxt "#30192"
msgid "Use a {} account"
msgstr "Usar una cuenta de {}"
msgctxt "#30200" msgctxt "#30200"
msgid "Error" msgid "Error"
msgstr "Error" msgstr "Error"
@@ -372,6 +411,11 @@ msgctxt "#30303"
msgid "IPTV Manager settings" msgid "IPTV Manager settings"
msgstr "Opciones de IPTV Manager" msgstr "Opciones de IPTV Manager"
# For Orange and Movistar only
msgctxt "#30304"
msgid "IPTV"
msgstr "IPTV"
msgctxt "#30305" msgctxt "#30305"
msgid "Export channels and EPG for IPTV automatically" msgid "Export channels and EPG for IPTV automatically"
msgstr "Exportar automáticamente canales y guía para IPTV" msgstr "Exportar automáticamente canales y guía para IPTV"
@@ -407,3 +451,23 @@ msgstr "Calificación: {}"
msgctxt "#30321" msgctxt "#30321"
msgid "Show age rating before playback" msgid "Show age rating before playback"
msgstr "Mostrar la calificación de edades al empezar la reproducción" msgstr "Mostrar la calificación de edades al empezar la reproducción"
msgctxt "#30400"
msgid "{} days remaining"
msgstr "quedan {} días"
msgctxt "#30401"
msgid "{} hours remaining"
msgstr "quedan {} horas"
msgctxt "#30450"
msgid "Buy the developer a coffee"
msgstr "Invita al programador a un café"
msgctxt "#30451"
msgid "If you find this addon useful you can buy the developer a coffee:"
msgstr "Si este addon es útil para ti puedes invitar al programador a un café:"
#~ msgctxt "#30040"
#~ msgid "Use only for these languages (e.g.: es en pt):"
#~ msgstr "Usar solo para estos idiomas (ej: es en pt):"
+44
View File
@@ -0,0 +1,44 @@
# encoding: utf-8
#
# SPDX-License-Identifier: LGPL-2.1-or-later
from __future__ import unicode_literals, absolute_import, division
import xbmcgui
import xbmc
import xbmcaddon
class CustomDialog(xbmcgui.WindowXMLDialog):
def __init__(self, *args, **kwargs):
self.image = kwargs.get("image", "")
#self.heading = kwargs.get("heading", "")
self.text = kwargs.get("text", "")
def onInit(self):
self.imagecontrol = 501
self.textbox = 502
self.okbutton = 503
self.heading = 504
self.showdialog()
def showdialog(self):
self.getControl(self.imagecontrol).setImage(self.image)
self.getControl(self.textbox).setText(self.text)
#self.getControl(self.heading).setLabel(self.heading)
self.setFocus(self.getControl(self.okbutton))
def onClick(self, controlId):
if (controlId == self.okbutton):
self.close()
def show_donation_dialog():
addon = xbmcaddon.Addon()
try:
CWD = addon.getAddonInfo('path').decode('utf-8')
except:
CWD = addon.getAddonInfo('path')
image = 'qr.png'
text = addon.getLocalizedString(30451)
text += '[CR]https://www.buymeacoffee.com/addons'
dialog = CustomDialog("customdialog.xml", CWD, 'default', '1080i', text=text, image=image)
dialog.doModal()
+6 -2
View File
@@ -7,7 +7,7 @@ import xbmc
import xbmcgui import xbmcgui
import xbmcplugin import xbmcplugin
from .log import LOG from .log import LOG
from .addon import addon from .addon import addon,translatePath
def handle(): def handle():
try: try:
@@ -34,12 +34,16 @@ def open_folder(name, content_type = 'videos'):
def close_folder(updateListing=False, cacheToDisc=True): def close_folder(updateListing=False, cacheToDisc=True):
xbmcplugin.endOfDirectory(handle(), updateListing=updateListing, cacheToDisc=cacheToDisc) xbmcplugin.endOfDirectory(handle(), updateListing=updateListing, cacheToDisc=cacheToDisc)
def add_menu_option(title, url, context_menu = None, info = None, art = None): def add_menu_option(title, url, context_menu = None, info = None, art = None, icon=None):
list_item = xbmcgui.ListItem(label=title) list_item = xbmcgui.ListItem(label=title)
if not info: if not info:
info = {'title': title, 'plot': '[B][/B]'} info = {'title': title, 'plot': '[B][/B]'}
if not art: if not art:
art = {'icon': addon.getAddonInfo('icon'), 'poster': addon.getAddonInfo('icon')} art = {'icon': addon.getAddonInfo('icon'), 'poster': addon.getAddonInfo('icon')}
if icon:
path = addon.getAddonInfo('path')
icon_path = translatePath(path + '/resources/icons/' + icon)
art = {'icon': icon_path, 'poster': icon_path}
list_item.setInfo('video', info) list_item.setInfo('video', info)
list_item.setArt(art) list_item.setArt(art)
if context_menu: if context_menu:
+10 -3
View File
@@ -1145,6 +1145,13 @@ class Movistar(object):
return res return res
def export_epg_to_xml(self, filename): def export_epg_to_xml(self, filename):
if sys.version_info[0] < 3:
# Python 2
from cgi import escape as html_escape
else:
# Python 3
from html import escape as html_escape
channels = self.export_channels() channels = self.export_channels()
res = [] res = []
res.append('<?xml version="1.0" encoding="UTF-8"?>\n' + res.append('<?xml version="1.0" encoding="UTF-8"?>\n' +
@@ -1169,12 +1176,12 @@ class Movistar(object):
res.append('<programme start="{}" stop="{}" channel="{}"'.format(start, stop, ch['id']) + res.append('<programme start="{}" stop="{}" channel="{}"'.format(start, stop, ch['id']) +
(' catchup-id="{}"'.format(url) if url else "") + (' catchup-id="{}"'.format(url) if url else "") +
'>\n' + '>\n' +
' <title>{}</title>\n'.format(e['title']) + ' <title>{}</title>\n'.format(html_escape(e['title'])) +
' <sub-title>{}</sub-title>\n'.format(e['subtitle'])) ' <sub-title>{}</sub-title>\n'.format(html_escape(e['subtitle'])))
if 'image' in e: if 'image' in e:
res.append(' <icon src="{}"/>\n'.format(e['image'])) res.append(' <icon src="{}"/>\n'.format(e['image']))
if 'description' in e: if 'description' in e:
res.append(' <desc>{}</desc>\n'.format(e['description'])) res.append(' <desc>{}</desc>\n'.format(html_escape(e['description'])))
if 'credits' in e and len(e['credits']) > 0: if 'credits' in e and len(e['credits']) > 0:
res.append(' <credits>\n'); res.append(' <credits>\n');
for c in e['credits']: for c in e['credits']:
+18 -13
View File
@@ -641,23 +641,31 @@ def router(paramstring):
else: else:
# Main # Main
open_folder(addon.getLocalizedString(30101)) # Menu open_folder(addon.getLocalizedString(30101)) # Menu
xbmcplugin.setContent(_handle, 'files')
if m.logged: if m.logged:
add_menu_option(addon.getLocalizedString(30104), get_url(action='tv')) # TV add_menu_option(addon.getLocalizedString(30104), get_url(action='tv'), icon='tv.png') # TV
add_menu_option(addon.getLocalizedString(30107), get_url(action='epg')) # EGP add_menu_option(addon.getLocalizedString(30107), get_url(action='epg'), icon='epg.png') # EGP
add_menu_option(addon.getLocalizedString(30102), get_url(action='wishlist')) # My list add_menu_option(addon.getLocalizedString(30102), get_url(action='wishlist'), icon='mylist.png') # My list
add_menu_option(addon.getLocalizedString(30103), get_url(action='recordings')) # Recordings add_menu_option(addon.getLocalizedString(30103), get_url(action='recordings'), icon='recording.png') # Recordings
add_menu_option(addon.getLocalizedString(30111), get_url(action='vod')) # VOD add_menu_option(addon.getLocalizedString(30111), get_url(action='vod'), icon='vod.png') # VOD
add_menu_option(addon.getLocalizedString(30112), get_url(action='search')) # Search add_menu_option(addon.getLocalizedString(30112), get_url(action='search'), icon='search.png') # Search
add_menu_option(addon.getLocalizedString(30180), get_url(action='profiles')) # Profiles add_menu_option(addon.getLocalizedString(30180), get_url(action='profiles'), icon='profiles.png') # Profiles
add_menu_option(addon.getLocalizedString(30108), get_url(action='devices')) # Devices add_menu_option(addon.getLocalizedString(30108), get_url(action='devices'), icon='devices.png') # Devices
add_menu_option(addon.getLocalizedString(30160), get_url(action='user')) # Accounts add_menu_option(addon.getLocalizedString(30160), get_url(action='user'), icon='account.png') # Accounts
close_folder(cacheToDisc=False) close_folder(cacheToDisc=False)
def run(): def run():
# Call the router function and pass the plugin call parameters to it.
# We use string slicing to trim the leading '?' from the plugin call paramstring
params = sys.argv[2][1:]
if 'show_donation_dialog' in params:
from .customdialog import show_donation_dialog
show_donation_dialog()
return
global m global m
reuse_devices = addon.getSettingBool('reuse_devices') reuse_devices = addon.getSettingBool('reuse_devices')
LOG('profile_dir: {}'.format(profile_dir)) LOG('profile_dir: {}'.format(profile_dir))
@@ -673,9 +681,6 @@ def run():
# Clear cache # Clear cache
LOG('Cleaning cache. {} files removed.'.format(m.cache.clear_cache())) LOG('Cleaning cache. {} files removed.'.format(m.cache.clear_cache()))
# Call the router function and pass the plugin call parameters to it.
# We use string slicing to trim the leading '?' from the plugin call paramstring
params = sys.argv[2][1:]
if '/iptv/channels' in sys.argv[0]: params += '&action=iptv-channels' if '/iptv/channels' in sys.argv[0]: params += '&action=iptv-channels'
elif '/iptv/epg' in sys.argv[0]: params += '&action=iptv-epg' elif '/iptv/epg' in sys.argv[0]: params += '&action=iptv-epg'
router(params) router(params)
+2 -1
View File
@@ -8,8 +8,9 @@
<setting label="30019" type="action" id="is_settings" action="Addon.OpenSettings(inputstream.adaptive)" enable="System.HasAddon(inputstream.adaptive)" option="close"/> <setting label="30019" type="action" id="is_settings" action="Addon.OpenSettings(inputstream.adaptive)" enable="System.HasAddon(inputstream.adaptive)" option="close"/>
<setting id="reuse_devices" type="bool" label="30023" default="false" visible="true"/> <setting id="reuse_devices" type="bool" label="30023" default="false" visible="true"/>
<setting id="open_session" type="bool" label="30022" default="true" visible="true"/> <setting id="open_session" type="bool" label="30022" default="true" visible="true"/>
<setting type="sep"/>
<setting id="profile_id" type="labelenum" label="Profile ID" values="Auto|OTT|NODTH"/> <setting id="profile_id" type="labelenum" label="Profile ID" values="Auto|OTT|NODTH"/>
<setting type="sep"/>
<setting label="30450" type="action" id="donation" action="RunPlugin(plugin://plugin.video.movistarplus?action=show_donation_dialog)" option="close"/>
</category> </category>
<category label="30002"> <category label="30002">
<setting label="30011" type="bool" id="manifest_modification" default="true"/> <setting label="30011" type="bool" id="manifest_modification" default="true"/>
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<coordinates>
<left>502</left>
<top>345</top>
</coordinates>
<controls>
<animation type="WindowOpen" reversible="false">
<effect type="zoom" start="80" end="100" center="960,540" delay="160" tween="back" time="240" />
<effect type="fade" delay="160" end="100" time="240" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="zoom" start="100" end="80" center="960,540" easing="in" tween="back" time="240" />
<effect type="fade" start="100" end="0" time="240" />
</animation>
<control type="image">
<left>-1920</left>
<top>-1080</top>
<width>5760</width>
<height>3240</height>
<animation effect="fade" start="0" end="100" time="300">WindowOpen</animation>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<texture colordiffuse="C2FFFFFF">black.png</texture>
</control>
<control type="image">
<left>0</left>
<top>0</top>
<width>1030</width>
<height>380</height>
<texture border="2">dialog-bg.png</texture>
</control>
<control type="image">
<left>0</left>
<top>0</top>
<width>1030</width>
<height>70</height>
<texture colordiffuse="FF12B2E7" border="2">white.png</texture>
</control>
<control type="label" id="504">
<textoffsetx>70</textoffsetx>
<left>0</left>
<top>0</top>
<width>1030</width>
<height>70</height>
<font>font20_title</font>
<label>[B]$INFO[System.AddonTitle(plugin.video.movistarplus)][/B]</label>
<align>center</align>
<aligny>center</aligny>
<shadowcolor>FF000000</shadowcolor>
</control>
<control type="image" id="501">
<left>30</left>
<top>75</top>
<width>300</width>
<height>300</height>
<aspectratio aligny="center" align="center">keep</aspectratio>
</control>
<control type="textbox" id="502">
<left>360</left>
<top>85</top>
<width>660</width>
<height>300</height>
<font>font12_title</font>
<align>left</align>
<aligny>top</aligny>
<shadowcolor>FF000000</shadowcolor>
</control>
<control type="button" id="503">
<left>715</left>
<top>290</top>
<width>300</width>
<height>90</height>
<font>font12_title</font>
<textcolor>FFF0F0F0</textcolor>
<textoffsetx>20</textoffsetx>
<label>15067</label>
<align>center</align>
<aligny>center</aligny>
<texturefocus border="40" colordiffuse="FF12B2E7">dialogbutton-fo.png</texturefocus>
<texturenofocus border="40">dialogbutton-nofo.png</texturenofocus>
</control>
</controls>
</window>
Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B