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