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')