diff --git a/jtv2xmltv/convert.py b/jtv2xmltv/convert.py index 352a589..dc075fc 100644 --- a/jtv2xmltv/convert.py +++ b/jtv2xmltv/convert.py @@ -1,10 +1,13 @@ +from __future__ import print_function from xml.etree import ElementTree import zipfile +import sys from jtv2xmltv.parser import parse_schedule, parse_titles from jtv2xmltv.utils import fix_zip_filename -def convert_jtv_to_xmltv(jtv_filename, epg_encoding="utf8", epg_timezone="UTC", epg_lang=None): +def convert_jtv_to_xmltv(jtv_filename, jtv_encoding="cp1251", xmltv_encoding="utf8", xmltv_timezone="UTC", + xmltv_lang=None): archive = zipfile.ZipFile(jtv_filename, 'r') xmltv_tv = ElementTree.Element('tv') channel_id = 0 @@ -14,23 +17,34 @@ def convert_jtv_to_xmltv(jtv_filename, epg_encoding="utf8", epg_timezone="UTC", channel_name = unicode_name[0:-4] channel_id = channel_id + 1 xmltv_channel = ElementTree.SubElement(xmltv_tv, 'channel', id=str(channel_id)) - if epg_lang is not None: - ElementTree.SubElement(xmltv_channel, 'display-name', lang=str(epg_lang)).text = channel_name + if xmltv_lang is not None: + ElementTree.SubElement(xmltv_channel, 'display-name', lang=str(xmltv_lang)).text = channel_name else: ElementTree.SubElement(xmltv_channel, 'display-name').text = channel_name channel_id = 0 for filename in archive.namelist(): if filename.endswith('.pdt'): channel_id = channel_id + 1 - titles = archive.read(filename) - channel_titles = parse_titles(titles) - schedules = archive.read(filename[0:-4] + ".ndx") - channel_schedules = parse_schedule(schedules) + try: + titles_filename = filename + titles = archive.read(titles_filename) + channel_titles = parse_titles(titles, encoding=jtv_encoding) + except Exception as e: + print("Failed to process titles in {}: {}".format(titles_filename, str(e)), file=sys.stderr) + continue + + try: + schedules_filename = filename[0:-4] + ".ndx" + schedules = archive.read(schedules_filename) + channel_schedules = parse_schedule(schedules) + except Exception as e: + print("Failed to process schedule in {}: {}".format(schedules_filename, str(e)), file=sys.stderr) + continue i = 0 for curr_title in channel_titles: - if epg_timezone != "UTC": - time_format = '%Y%m%d%H%M%S ' + epg_timezone + if xmltv_timezone != "UTC": + time_format = '%Y%m%d%H%M%S ' + xmltv_timezone else: time_format = '%Y%m%d%H%M%S' if i < len(channel_schedules) - 1: @@ -42,10 +56,10 @@ def convert_jtv_to_xmltv(jtv_filename, epg_encoding="utf8", epg_timezone="UTC", xmltv_programme = ElementTree.SubElement(xmltv_tv, 'programme', start=channel_schedules[i].strftime(time_format), channel=str(channel_id)) - if epg_lang is not None: - ElementTree.SubElement(xmltv_programme, 'title', lang=str(epg_lang)).text = curr_title + if xmltv_lang is not None: + ElementTree.SubElement(xmltv_programme, 'title', lang=str(xmltv_lang)).text = curr_title else: ElementTree.SubElement(xmltv_programme, 'title').text = curr_title i = i + 1 archive.close() - return ElementTree.tostring(xmltv_tv, encoding=epg_encoding, method="xml").decode(encoding=epg_encoding) + return ElementTree.tostring(xmltv_tv, encoding=xmltv_encoding, method="xml").decode(encoding=xmltv_encoding) diff --git a/jtv2xmltv/main.py b/jtv2xmltv/main.py index a46fa93..069d95e 100644 --- a/jtv2xmltv/main.py +++ b/jtv2xmltv/main.py @@ -16,16 +16,18 @@ def main(): parser.add_argument('-i', '--inputfile', required=True) parser.add_argument('-o', '--outputfile', default='-') parser.add_argument('-t', '--timezone') + parser.add_argument('-e', '--encoding', default='cp1251') args = parser.parse_args() jtv_filename = args.inputfile xmltv_filename = args.outputfile + jtv_encoding = args.encoding if args.timezone is None: tz_format = 'UTC' elif args.timezone[0] == '-' or args.timezone[0] == '+': tz_format = str(args.timezone) else: tz_format = '+' + str(args.timezone) - xmltv_content = convert_jtv_to_xmltv(jtv_filename, epg_timezone=tz_format) + xmltv_content = convert_jtv_to_xmltv(jtv_filename, jtv_encoding=jtv_encoding, xmltv_timezone=tz_format) if xmltv_filename is None or xmltv_filename == "-": print(xmltv_content) else: diff --git a/jtv2xmltv/parser.py b/jtv2xmltv/parser.py index 260b2a2..079e3de 100644 --- a/jtv2xmltv/parser.py +++ b/jtv2xmltv/parser.py @@ -2,17 +2,16 @@ from jtv2xmltv.utils import filetime_to_datetime -def parse_titles(data): - jtv_header = b"JTV 3.x TV Program Data\x0a\x0a\x0a" - if data[0:26] != jtv_header: +def parse_titles(data, encoding="cp1251"): + jtv_headers = [b"JTV 3.x TV Program Data\x0a\x0a\x0a", b"JTV 3.x TV Program Data\xa0\xa0\xa0"] + if data[0:26] not in jtv_headers: raise Exception('Invalid JTV format') data = data[26:] titles = [] while data: title_length = int(struct.unpack('