On Sat, 2008-04-19 at 11:48 +0200, Klaus Schmidinger wrote:
> On 04/16/08 14:45, Matthias Schwarzott wrote:
> > On Mittwoch, 16. April 2008, Soeren Sonnenburg wrote:
> >> Dear List,
> >>
> >> I am desperately trying to get the german umlauts going for both vdr
> >> receiving EPG information (out of the air directly from the channels...)
> >> and via epg4vdr 0.5
> >> http://www.wontorra.net/article.php?story=20050429181815661
> >>
> >> I've noticed that standard EPG has the correct encoding, but only the
> >> one from epg4vdr has not. However the pulled .xml files still have the
> >> right (i.e. utf-8) encoding.
> >>
> >> Only when this information is transferred to vdr (I guess via SVDRP)
> >> umlauts and everything is distorted. Also then the dumped epgdata file
> >> contains wrongly encoded parts...
> >>
> >> Any ideas what I could do about this?
> >>
> > I guess you need to know the encoding your vdr runs with, and then use this 
> > for the SVDRP connection.
> > 
> > 
> > For future VDR development I still think it could be useful to:
> > 1. Either add a header for epg data (and other places where vdr exchanges 
> > texts) telling the encoding.
> 
> The only reasonable thing IMO would be to make an SVDRP command (or extend an
> existing one) that tells which encoding is used by this VDR. Maybe an extended
> signon message would be ok, like
> 
> 220 video SVDRP VideoDiskRecorder 1.7.1; Sat Apr 19 11:43:27 2008; ISO-8859-1
> 
> I wouldn't like to fiddle around with headers in many places.

That sounds like a good solution.

Regarding the specific epg4vdr problem: it was sufficient to 

a) put the locale to some utf8 locale
b) extract the epg4vdr archive and change the occurance of iso8859 to
utf8 for writng the xml file


Otherwise utf8 is erraneously read as iso8859-1. Also as a workaround I
wrote a small proxy that does this translation on the fly (attached).

Soeren
#!/usr/bin/env python

import SocketServer
import socket
import os
import time

src=('localhost', 2002)
dst=("localhost", 2001)

linelen=100

overflow=dict()

def read_line(f, who):
	if not overflow.has_key(f):
		overflow[f]=''
	s=overflow[f]
	while True:
		i=s.find('\n')
		if i>-1:
			data=s[:(i+1)]
			overflow[f]=s[(i+1):]
			break

		d=f.recv(1024)
		if not d:
			data=s
			overflow[f]=''
			break
		s+=d

	l=len(data)
	#print '<-- %s: %d %s' % (who, l, data)
	return data

def write_line(f, data, who):
	f.sendall(data)
	l=len(data)
	#print '--> %s: %d %s' % (who, l, data)

class MyClientHandler(SocketServer.BaseRequestHandler):

	def handle(self):
		#print "connect from: " + `self.client_address`

		epg=self.request
		vdr=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		vdr.connect(dst) # connecting to vdr

		while 1:
			try:
				data = read_line(vdr, "vdr")
				if not data:
					break 
				write_line(epg, data, "epg4vdr")

				if data.startswith('354'):
					#print "sending EPG to vdr"
					sending=True
					while sending:
						data = read_line(epg, "epg4vdr")
						if not data or data=='.\n':
							data='.\n'
							sending=False

						cvt=data.decode('utf-8', 'ignore').encode('iso8859-1','ignore')
						write_line(vdr, cvt, "vdr")
					#print "--> vdr : epgs done"
				else:
					data = read_line(epg, "epg4vdr")
					if not data:
						break 
					#print(u'' + data.decode('utf-8').encode('iso8859-1').decode('utf-8'))
					#print data.decode('utf-8').encode('iso8859-1','ignore')
					#print data.encode('utf-8')
					#print data.decode('utf-8')
					#cvt=data.decode('utf-8', 'ignore').encode('iso8859-1','ignore')
					write_line(vdr, data, "vdr")
			except KeyboardInterrupt:
				break

		vdr.shutdown(socket.SHUT_RDWR)
		vdr.close()
		epg.close()

# make a threaded server, listen/handle clients forever 
try:
	server = SocketServer.TCPServer(src, MyClientHandler)
	server.serve_forever()
except KeyboardInterrupt:
	server.server_close()
_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to