#!/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')