Skip to content

Commit

Permalink
Make JSON-STREAMS group a list (#77)
Browse files Browse the repository at this point in the history
* Make JSON-STREAMS group a list

Just as the M3U8 standard allows multiple group names, JSON-STREAMS
should accept a list of groups.

* Add test for groups

* assertRegexp doesn't exist in Python 2.7

Co-authored-by: Michaël Arnauts <michael.arnauts@gmail.com>
  • Loading branch information
dagwieers and michaelarnauts authored Feb 3, 2021
1 parent 0fae37e commit 9182d5d
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 4 deletions.
18 changes: 16 additions & 2 deletions resources/lib/modules/addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from __future__ import absolute_import, division, unicode_literals

import sys
import json
import logging
import os
Expand Down Expand Up @@ -164,9 +165,22 @@ def get_channels(self):
elif not channel.get('logo').startswith(('http://', 'https://', 'special://', 'resource://', '/')):
channel['logo'] = os.path.join(self.addon_path, channel.get('logo'))

# Add add-on name as group
# Ensure group is a set
if not channel.get('group'):
channel['group'] = kodiutils.addon_name(self.addon_obj)
channel['group'] = set()
# Accept string values (backward compatible)
elif isinstance(channel.get('group'), (bytes, str)):
channel['group'] = set(channel.get('group').split(';'))
# Accept string values (backward compatible, py2 version)
elif sys.version_info.major == 2 and isinstance(channel.get('group'), unicode): # noqa: F821; pylint: disable=undefined-variable
channel['group'] = set(channel.get('group').split(';'))
elif isinstance(channel.get('group'), list):
channel['group'] = set(list(channel.get('group')))
else:
_LOGGER.warning('Channel group is not a list: %s', channel)
channel['group'] = set()
# Add add-on name as group, if not already
channel['group'].add(kodiutils.addon_name(self.addon_obj))

channels.append(channel)

Expand Down
2 changes: 1 addition & 1 deletion resources/lib/modules/iptvsimple.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def write_playlist(channels):
if channel.get('preset'):
m3u8_data += ' tvg-chno="{preset}"'.format(**channel)
if channel.get('group'):
m3u8_data += ' group-title="{group}"'.format(**channel)
m3u8_data += ' group-title="{groups}"'.format(groups=';'.join(channel.get('group')))
if channel.get('radio'):
m3u8_data += ' radio="true"'
m3u8_data += ' catchup="vod",{name}\n'.format(**channel)
Expand Down
2 changes: 2 additions & 0 deletions tests/home/addons/plugin.video.example/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def send_channels(): # pylint: disable=no-method-argument
preset=901,
stream='plugin://plugin.video.example/play/901',
logo='https://example.com/radio1.png',
group='VRT',
radio=True,
),
dict(
Expand All @@ -76,6 +77,7 @@ def send_channels(): # pylint: disable=no-method-argument
preset=101,
stream='plugin://plugin.video.example/play/één',
logo='https://example.com/één.png',
group=['Belgium', 'VRT'],
),
]
return dict(version=1, streams=streams)
Expand Down
12 changes: 11 additions & 1 deletion tests/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
from __future__ import absolute_import, division, print_function, unicode_literals

import os
import re
import time
import unittest
import lxml.etree

import lxml.etree
import xbmc
from mock import patch
from xbmcgui import ListItem
Expand Down Expand Up @@ -49,6 +50,15 @@ def test_refresh(self):
self.assertTrue('raw1.com' in data)
self.assertTrue('#KODIPROP:inputstream=inputstream.ffmpegdirect' in data)

# Check groups
# self.assertRegex doesn't exists in Python 2.7, and self.assertRegexpMatches throws warnings in Python 3
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="channel1.com".*?group-title="Example IPTV Addon"', data))
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="één.be".*?group-title=".*?VRT.*?"', data))
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="één.be".*?group-title=".*?Belgium.*?"', data))
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="één.be".*?group-title=".*?Example IPTV Addon.*?"', data))
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="radio1.com".*?group-title=".*?VRT.*?"', data))
self.assertTrue(re.search(r'#EXTINF:-1 .*?tvg-id="radio1.com".*?group-title=".*?Example IPTV Addon.*?"', data))

# Validate EPG
xml = lxml.etree.parse(epg_path)
validator = lxml.etree.DTD('tests/xmltv.dtd')
Expand Down

0 comments on commit 9182d5d

Please sign in to comment.