[zeromq-dev] twisted/coherence and zmq

Nicholas Lagaros nicholas at lagaros.com
Tue Nov 19 17:43:30 CET 2013


 

I am trying to create simple publisher that will send media player
updates to another process. I understand there are event loop conflicts
between zmq and twisted. Can anyone recommend a better way to code this?


#! /usr/bin/python2.5

import sys
sys.path.insert(1, './lib')

import cPickle as pickle

from twisted.internet import reactor
from coherence.base import Coherence
from coherence.upnp.devices.control_point import ControlPoint
from coherence.upnp.core import DIDLLite

import zmq

ZonePlayers = []
Son = [0,0,0,0,0,0,0,0,0,0,0,0]
SonArray = [{}]
sck = None

class SonosPlayer:
 SonosCount = 0

 def __init__(self, uuid):
 global SonArray
 self.uuid = uuid

 self.index = SonosPlayer.SonosCount
 SonosPlayer.SonosCount += 1
 SonArray[self.index] = {'uuid':self.uuid}

 def returnSonosCount(self):
 return SonosPlayer.SonosCount

 def state_variable_change(self, variable):
 global sck
 global SonArray
 print "variable: %s" % variable.name
 #print "variable value: %s" % variable.value
 print "update from: %s" % self.uuid
 #print SonArray

 if variable.name == 'CurrentTrackMetaData':
 if variable.value != None and len(variable.value)>0:
 try:
 elt = DIDLLite.DIDLElement.fromString(variable.value)
 for item in elt.getItems():
 SonArray[self.index]['creator'] = item.creator
 SonArray[self.index]['albumArtist'] = item.albumArtist
 SonArray[self.index]['artist'] = item.artist
 SonArray[self.index]['albumArtURI'] = item.albumArtURI
 SonArray[self.index]['title'] = item.title
 SonArray[self.index]['album'] = item.album
 except SyntaxError:
 print "current error"
 return
 elif variable.name == 'NextTrackMetaData':
 if variable.value != None and len(variable.value)>0:
 try:
 elt = DIDLLite.DIDLElement.fromString(variable.value)
 for item in elt.getItems():
 SonArray[self.index]['next_creator'] = item.creator
 SonArray[self.index]['next_albumArtist'] = item.albumArtist
 SonArray[self.index]['next_artist'] = item.artist
 SonArray[self.index]['next_albumArtURI'] = item.albumArtURI
 SonArray[self.index]['next_title'] = item.title
 SonArray[self.index]['next_album'] = item.album
 except SyntaxError:
 print "next error"
 return
 elif variable.name == 'TransportState':
 SonArray[self.index]['TransportState'] = variable.value

 f = open("SonosEvents.pkl", "wb")
 pickle.dump(SonArray, f, protocol=2)
 f.close()

 msg = self.uuid + " " + SonArray[self.index]['title']
 print msg
 sck.send(msg)

def media_renderer_found(client,udn):
 global ZonePlayers
 global Son
 Xudn = udn[5:-3]
 print ("%s:%s:%s" % (udn, Xudn, ZonePlayers))
 if Xudn in ZonePlayers:
 print "media_renderer_found", udn
 Son[SonosPlayer.SonosCount] = SonosPlayer(Xudn)
 client.av_transport.subscribe_for_variable('CurrentTrackMetaData',
Son[SonosPlayer.SonosCount].state_variable_change)
 client.av_transport.subscribe_for_variable('NextTrackMetaData',
Son[SonosPlayer.SonosCount].state_variable_change)
 client.av_transport.subscribe_for_variable('LastChange',
Son[SonosPlayer.SonosCount].state_variable_change)
 client.av_transport.subscribe_for_variable('TransportState',
Son[SonosPlayer.SonosCount].state_variable_change)

def media_renderer_removed(udn):
 print "media_renderer_removed", udn

def start():
 control_point = ControlPoint(Coherence({'logmode':'warn'}),
auto_client=['MediaRenderer'])
 control_point.connect(media_renderer_found,
'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
 control_point.connect(media_renderer_removed,
'Coherence.UPnP.ControlPoint.MediaRenderer.removed')

f = open("ZonePlayers.pkl", "rb")
ZonePlayers = pickle.load(f)
f.close()

context = zmq.Context()
sck = context.socket(zmq.PUB)
sck.bind('tcp://127.0.0.1:9999')

reactor.callWhenRunning(start)
reactor.run()

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20131119/288863af/attachment.html>


More information about the zeromq-dev mailing list