1.0.1: get along with KodiMov+
- Channel numbers: 1.0.0 set "use channel numbers from backend" before "always", which Kodi refuses with more than one PVR instance loaded, and wrote its marker anyway. Now it checks every 5 minutes: if the setting is hidden it turns "always" on, and it turns the setting on once (new marker numbers-on, so existing installs get one proper pass). It never turns anything off, and turning it off by hand afterwards is respected. - Takes turns with KodiMov+ to restart IPTV Simple, through the pvr.iptvsimple.restarting property of Kodi's home window. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
This commit is contained in:
1 parent
798c08d1b8
commit
333b8ef7ad
3 files changed
+79
-17
No files matched your search
+61
-12
@@ -18,6 +18,7 @@ import time
|
||||
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
import xbmcvfs
|
||||
|
||||
from resources.lib import epg
|
||||
@@ -29,6 +30,12 @@ PROFILE = 'special://profile/addon_data/{}/'.format(ADDON_ID)
|
||||
FIRST_INSTANCE = 95 # KodiMov+ uses 91 (VAIO) and 93 (.49)
|
||||
GUIDE_EVERY = 6 * 3600
|
||||
GUIDE_RETRY = 30 * 60
|
||||
NUMBERS_EVERY = 5 * 60
|
||||
# IPTV Simple is shared with KodiMov+ (its instance is the TV section).
|
||||
# Restarting it restarts every instance, so the add-ons take turns: whoever
|
||||
# restarts it says so in this property of Kodi's home window (the time it
|
||||
# started), and the other waits. KodiMov+ uses the same name.
|
||||
IPTV_RESTART_PROPERTY = 'pvr.iptvsimple.restarting'
|
||||
|
||||
SETTINGS = '''<settings version="2">
|
||||
<setting id="kodi_addon_instance_name">Radios de Vigo</setting>
|
||||
@@ -92,9 +99,53 @@ def instance_file(pvr_dir):
|
||||
|
||||
|
||||
def restart_iptv_simple():
|
||||
for enabled in (False, True):
|
||||
rpc('Addons.SetAddonEnabled', addonid='pvr.iptvsimple', enabled=enabled)
|
||||
xbmc.sleep(3000)
|
||||
window = xbmcgui.Window(10000)
|
||||
for _ in range(40): # KodiMov+ is restarting it: wait (a turn older than 20 s is stale)
|
||||
try:
|
||||
busy = 0 <= time.time() - float(window.getProperty(IPTV_RESTART_PROPERTY) or 0) < 20
|
||||
except ValueError:
|
||||
busy = False
|
||||
if not busy:
|
||||
break
|
||||
xbmc.sleep(1000)
|
||||
window.setProperty(IPTV_RESTART_PROPERTY, str(time.time()))
|
||||
try:
|
||||
for enabled in (False, True):
|
||||
rpc('Addons.SetAddonEnabled', addonid='pvr.iptvsimple', enabled=enabled)
|
||||
xbmc.sleep(3000)
|
||||
finally:
|
||||
window.clearProperty(IPTV_RESTART_PROPERTY)
|
||||
|
||||
|
||||
def ensure_channel_numbers(marker):
|
||||
"""Makes Kodi show the stations' own numbers (the Vigo ones are their FM
|
||||
frequency) instead of 1, 2, 3...
|
||||
|
||||
Kodi only lets "use channel numbers from backend" be read or changed
|
||||
while it applies: with exactly one PVR instance loaded, or with several
|
||||
and the "always" setting on. This add-on's instance usually sits next to
|
||||
KodiMov+'s, and which one came first changes what Kodi accepts, so this
|
||||
runs now and then and puts it right:
|
||||
- hidden: turns "always" on, which brings the stored value back;
|
||||
- off and never turned on by this add-on (no marker file): turns it on;
|
||||
- off after this add-on turned it on once: the user's choice, left alone.
|
||||
It never turns anything off, so it can't undo what KodiMov+ needs for
|
||||
Movistar's TV numbers. Returns True when Kodi is using the numbers."""
|
||||
def numbers():
|
||||
return (rpc('Settings.GetSettingValue', setting='pvrmanager.usebackendchannelnumbers').get('result') or {}).get('value')
|
||||
value = numbers()
|
||||
if value is None:
|
||||
rpc('Settings.SetSettingValue', setting='pvrmanager.usebackendchannelnumbersalways', value=True)
|
||||
value = numbers()
|
||||
if value is None:
|
||||
return False # IPTV Simple isn't loaded right now: try later
|
||||
if value is False and not os.path.exists(marker):
|
||||
rpc('Settings.SetSettingValue', setting='pvrmanager.usebackendchannelnumbers', value=True)
|
||||
value = numbers()
|
||||
if value is True and not os.path.exists(marker):
|
||||
write(marker, '')
|
||||
log('turned on backend channel numbers')
|
||||
return value is True
|
||||
|
||||
|
||||
def update_guide(profile, m3u):
|
||||
@@ -132,15 +183,10 @@ def main():
|
||||
write(path, SETTINGS)
|
||||
log('wrote ' + path)
|
||||
|
||||
numbers_set = os.path.join(profile, 'numbers-set')
|
||||
if not os.path.exists(numbers_set):
|
||||
# Show the stations' own numbers (Vigo ones are their FM frequency).
|
||||
# With more than one IPTV Simple instance Kodi ignores them unless
|
||||
# "always" is on too; that also keeps KodiMov+'s TV numbers.
|
||||
for setting in ('pvrmanager.usebackendchannelnumbers', 'pvrmanager.usebackendchannelnumbersalways'):
|
||||
rpc('Settings.SetSettingValue', setting=setting, value=True)
|
||||
write(numbers_set, '')
|
||||
log('turned on backend channel numbers')
|
||||
# "numbers-on", not the "numbers-set" of 1.0.0: that one was written even
|
||||
# when Kodi had refused the setting
|
||||
numbers_on = os.path.join(profile, 'numbers-on')
|
||||
next_numbers = time.time() + 30 # IPTV Simple has to be loaded first
|
||||
|
||||
# The guide is fetched in the background so Kodi can always stop this service quickly
|
||||
guide_ok = [True]
|
||||
@@ -171,6 +217,9 @@ def main():
|
||||
restart_iptv_simple()
|
||||
write(os.path.join(profile, 'state'), state)
|
||||
restart_pending = False
|
||||
if time.time() >= next_numbers:
|
||||
next_numbers = time.time() + NUMBERS_EVERY
|
||||
ensure_channel_numbers(numbers_on)
|
||||
if not job.is_alive():
|
||||
if not guide_ok[0]:
|
||||
next_guide = min(next_guide, time.time() + GUIDE_RETRY)
|
||||
|
||||
Reference in new issue
Block a user