- The TV guide setup always wrote instance-settings-91.xml, so on a box already set up with another instance (from the original add-on) both read channels.m3u8 and every channel showed twice. The setup now rewrites the instance that already reads the list, and the service deletes extra ones at start (keeps the one that isn't 91, which holds what was watched) and restarts IPTV Simple when nothing plays. - The web player registration for the new servers got one 401 error page and gave up, and the TV guide list then lacked LALIGA, DAZN LALIGA and Liga de Campeones until the next export 6 hours later. The registration is tried 3 times, and after a failure the service exports the list again every half hour, up to 6 times. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
3.3 KiB
Python
80 lines
3.3 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
import os
|
|
import time
|
|
import xbmc
|
|
import xbmcgui
|
|
from resources.lib.proxy import Proxy
|
|
from resources.lib.addon import *
|
|
from resources.lib.log import LOG
|
|
from resources.lib import kodimov
|
|
|
|
def file_age(filename):
|
|
"""Seconds since the file was last written (or found unchanged)."""
|
|
try:
|
|
return time.time() - os.path.getmtime(filename)
|
|
except OSError:
|
|
return float('inf')
|
|
|
|
if __name__ == '__main__':
|
|
LOG('Service started')
|
|
proxy = Proxy()
|
|
proxy.start()
|
|
LOG('proxy_address: {}'.format(proxy.proxy_address))
|
|
|
|
# Refreshes the TV guide channel list (new channels, new numbers) and the
|
|
# programme guide a minute after Kodi starts and then every 6 hours; a
|
|
# refresh that failed is tried again half an hour later. Opening the add-on
|
|
# also renews the 10-day Movistar login.
|
|
next_check = time.time() + 60
|
|
max_age = 0 # always refresh once after Kodi starts
|
|
new_api_retries = 6
|
|
try:
|
|
pvr_dir = translatePath(xbmcaddon.Addon('pvr.iptvsimple').getAddonInfo('profile'))
|
|
restart_iptv = kodimov.remove_duplicate_instances(pvr_dir, 'kodimovplus')
|
|
restart_iptv = kodimov.set_iptv_refresh(pvr_dir, 'kodimovplus') or restart_iptv
|
|
except RuntimeError: # IPTV Simple not installed or disabled
|
|
pvr_dir = None
|
|
restart_iptv = False
|
|
player = xbmc.Player()
|
|
monitor = xbmc.Monitor()
|
|
while not monitor.abortRequested():
|
|
if monitor.waitForAbort(1):
|
|
break
|
|
if restart_iptv and not player.isPlaying(): # restarting stops live TV
|
|
restart_iptv = False
|
|
kodimov.restart_iptv_simple()
|
|
if time.time() >= next_check:
|
|
next_check = time.time() + 30 * 60
|
|
exporting = False
|
|
# Movistar's channel numbers in Kodi's TV section, also when another
|
|
# add-on (Radios de Vigo) adds its own IPTV Simple instance
|
|
if pvr_dir and kodimov.has_iptv_instance(pvr_dir, 'kodimovplus'):
|
|
kodimov.ensure_channel_numbers(os.path.join(profile_dir, 'numbers-set'))
|
|
age_limit, max_age = max_age, 6 * 3600 - 120
|
|
# After Kodi starts (or this add-on updates) also get the new guide into Kodi now
|
|
reload_guide = '&reload_guide=1' if age_limit == 0 else ''
|
|
# The new servers failed (they at times refuse everything for minutes):
|
|
# the list lacks LALIGA, DAZN LALIGA, Liga de Campeones. Try again in
|
|
# half an hour, a few times, instead of in 6 hours.
|
|
if new_api_retries and kodimov.new_api_failed(profile_dir):
|
|
new_api_retries -= 1
|
|
age_limit = 0
|
|
reload_guide = '&reload_guide=1'
|
|
if addon.getSettingBool('auto_export_epg'): # channels + programme guide
|
|
if file_age(os.path.join(profile_dir, 'epg.xml')) > age_limit:
|
|
exporting = True
|
|
xbmc.executebuiltin('RunPlugin(plugin://plugin.video.kodimovplus/?action=export_epg_now&quiet=1' + reload_guide + ')')
|
|
elif addon.getSettingBool('export_channels'):
|
|
if file_age(os.path.join(profile_dir, 'channels.m3u8')) > age_limit:
|
|
exporting = True
|
|
xbmc.executebuiltin('RunPlugin(plugin://plugin.video.kodimovplus/?action=export_channels_now)')
|
|
if not exporting:
|
|
# Keeps the pass for the LALIGA / Liga de Campeones streams fresh
|
|
xbmc.executebuiltin('RunPlugin(plugin://plugin.video.kodimovplus/?action=new_api_keep_warm)')
|
|
|
|
proxy.stop()
|