diff --git a/epg2xml.py b/epg2xml.py new file mode 100644 index 0000000..2c81108 --- /dev/null +++ b/epg2xml.py @@ -0,0 +1,134 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import os +import sys +import urllib +import json +import datetime +import time +import codecs +import socket +import re +from xml.etree.ElementTree import Element, SubElement, dump +from xml.sax.saxutils import escape +import argparse + +default_broadcast='all' +default_xml_filename='xmlepgtv.xml' +default_xml_socket='xmltv.sock' +default_chanfile='channellist.json' +default_fetch_limit=3 + +def channelList(ips='ALL'): + global channels + ch_channels=[] + + url = ('http://iptv.neo365.net/api/iptv/epg/channellist/%s' % ( ips ) ) + u = urllib.urlopen(url) + data = u.read() + j = json.loads(data) + + channels = j["Channels"] + + for channel in channels: + ch_channelName = channel["ChannelName"] + ch_channelNo = channel["ChannelNo"] + + ch_channels.append('\t\n' % ( ch_channelNo)) + ch_channels.append('\t\t%s\n' % ( escape(ch_channelName)) ) + ch_channels.append('\t\t[%s] %s\n' % (ch_channelNo, escape(ch_channelName)) ) + + for ch_detail in channel["Details"]: + ch_detailNo = ch_detail["ChannelNo"] + ch_detailName = ch_detail["ChannelName"] + ch_channels.append('\t\t%s\n' % ( escape(ch_detailName)) ) + ch_channels.append('\t\t[%s] %s\n' % (ch_channelNo, escape(ch_detailName)) ) + + ch_channels.append('\t\n') + + for channel in channels: + for prog in channelDetail(channel["ChannelNo"]): + ch_channels.append(prog) + + return ch_channels + +def channelDetail(channelId): + global channel + prog=[] + url = ('http://iptv.neo365.net/api/iptv/epg/channel/%s' % ( channelId )) + u = urllib.urlopen(url) + data = u.read() + j = json.loads(data) + channel = j["Channel"] + + for program in channel["Programs"]: + pr_programName = program["ProgramName"] + pr_actorName = program["Actor"] + pr_startTime = ("%s +9000" % ( program["StartTime"]) ) + pr_endTime = ("%s +9000" % ( program["EndTime"]) ) + pr_mainGenreName = program["Genre"] + pr_ratingCd = program["Rating"] + pr_episode = None + + if isinstance(pr_programName, unicode): + pr_programName = escape(pr_programName) + if isinstance(pr_mainGenreName, unicode): + pr_mainGenreName = escape(pr_mainGenreName) + + if pr_ratingCd > '0': + pr_ratingCd = u'%s세 이상 시청가' %(pr_ratingCd) + else: + pr_ratingCd = u'모든 연령 시청가' + + match=re.search('(?<=\()[\d]+', pr_programName) + + if match: + pr_episode = match.group()+u' 회' + + prog.append('\t\n' % ( pr_startTime, pr_endTime ,channelId)) + prog.append('\t\t%s\n' %(pr_programName)) + prog.append('\t\t%s\n' %(pr_mainGenreName)) + if pr_episode: + prog.append('\t\t%s\n' % pr_episode) + prog.append('\t\t\n\t\t\t%s\n\t\t\n' % pr_ratingCd) + prog.append('\t\n') + return prog + +def writeXML(data): + if args.socket: + xmlfp.send(data.encode('utf-8')) + else: + xmlfp.write(data) + +parser = argparse.ArgumentParser() +cmds = parser.add_mutually_exclusive_group(required=True) +cmds.add_argument('-w', dest='outputfile', metavar=default_xml_filename, nargs='?', const=default_xml_filename, help=u'저장할 파일이름') +cmds.add_argument('-s', dest='socket', metavar=default_xml_socket, nargs='?', const=default_xml_socket, help=u'xmltv.sock(External: XMLTV)로 EPG정보 전송') +opts = parser.add_argument_group(u'추가옵션') +opts.add_argument('-i', dest='ips', help=u'사용하는 망 : SK, KT, LG, ALL', default='ALL') + +args = parser.parse_args() + + +global xmlfp + +if args.socket: + xmlfp = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + xmlfp.connect(args.socket) +elif args.outputfile: + xmlfp = codecs.open(args.outputfile, "w+", encoding="utf8") +else: + xmlfp = sys.stdout + +channels = [] +#channels = channelList(args.limit-1) +channels = channelList(args.ips) + +writeXML('\n\n') +writeXML('\n') + +for channel in channels: + writeXML(channel) + +writeXML('\n')