epg2xml.py 1.0.0
This commit is contained in:
parent
c12aa8186b
commit
8692a71664
134
epg2xml.py
Normal file
134
epg2xml.py
Normal file
@ -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<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')
|
Loading…
x
Reference in New Issue
Block a user