#!/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<channel id="%s">\n' % ( ch_channelNo))
		ch_channels.append('\t\t<display-name>%s</display-name>\n' % ( escape(ch_channelName)) )
		ch_channels.append('\t\t<display-name>[%s] %s</display-name>\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<display-name>%s</display-name>\n' % ( escape(ch_detailName)) )
			ch_channels.append('\t\t<display-name>[%s] %s</display-name>\n' % (ch_channelNo, escape(ch_detailName)) )

		ch_channels.append('\t</channel>\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<programme start="%s" stop="%s" channel="%s">\n' % ( pr_startTime, pr_endTime ,channelId))
		prog.append('\t\t<title lang="kr">%s</title>\n' %(pr_programName))
		prog.append('\t\t<category lang="kr">%s</category>\n' %(pr_mainGenreName))
		if pr_episode:
			prog.append('\t\t<episode-num system="onscreen">%s</episode-num>\n' % pr_episode)
		prog.append('\t\t<rating system="VCHIP">\n\t\t\t<value>%s</value>\n\t\t</rating>\n' % pr_ratingCd)		
		prog.append('\t</programme>\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('<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE tv SYSTEM "xmltv.dtd">\n')
writeXML('<tv source-info-url="iptv.neo365.net" source-info-name="epgi" generator-info-name="epgMaker">\n')

for channel in channels:
	writeXML(channel)

writeXML('</tv>\n')