plugin RadioCol: basic functionnality working approximately

This commit is contained in:
Goffi 2012-01-23 00:14:33 +01:00
commit d2235e1a63
3 changed files with 73 additions and 4 deletions

View file

@ -211,6 +211,9 @@ class DBusBridgeFrontend(BridgeFrontend):
def radiocolCreate(self, room_jid, profile_key):
return self.db_plugin_iface.radiocolCreate(room_jid, profile_key)
def radiocolSongAdded(self, room_jid, song_path, profile):
return self.db_plugin_iface.radiocolSongAdded(room_jid, song_path, profile)
def sendFile(self, to, path, data, profile_key):
return self.db_plugin_iface.sendFile(to, path, data, profile_key)

View file

@ -104,6 +104,9 @@ class DBusBridgeFrontend(BridgeFrontend):
def radiocolCreate(self, room_jid, profile_key):
return self.db_plugin_iface.radiocolCreate(room_jid, profile_key)
def radiocolSongAdded(self, room_jid, song_path, profile):
return self.db_plugin_iface.radiocolSongAdded(room_jid, song_path, profile)
def sendFile(self, to, path, data, profile_key):
return self.db_plugin_iface.sendFile(to, path, data, profile_key)

View file

@ -34,6 +34,8 @@ from sat.tools.xml_tools import dataForm2xml
from sat.tools.games import TarotCard
from time import time
import os.path
from mutagen.oggvorbis import OggVorbis
try:
from twisted.words.protocols.xmlstream import XMPPHandler
@ -63,9 +65,12 @@ class Radiocol():
info(_("Radio collective initialization"))
self.host = host
self.radios={}
host.bridge.addMethod("radiocolLaunch", ".plugin", in_sign='ass', out_sign='', method=self.radiocolLaunch) #args: occupants, profile
host.bridge.addMethod("radiocolCreate", ".plugin", in_sign='ss', out_sign='', method=self.radiocolCreate) #args: room_jid, profile
host.bridge.addSignal("radiocolStarted", ".plugin", signature='sss') #args: room_jid, referee, profile
host.bridge.addMethod("radiocolLaunch", ".plugin", in_sign='ass', out_sign='', method=self.radiocolLaunch)
host.bridge.addMethod("radiocolCreate", ".plugin", in_sign='ss', out_sign='', method=self.radiocolCreate)
host.bridge.addMethod("radiocolSongAdded", ".plugin", in_sign='sss', out_sign='', method=self.radiocolSongAdded)
host.bridge.addSignal("radiocolStarted", ".plugin", signature='sss') #room_jid, referee, profile
host.bridge.addSignal("radiocolSongRejected", ".plugin", signature='sss') #room_jid, reason, profile
host.bridge.addSignal("radiocolPreload", ".plugin", signature='ssssss') #room_jid, filename, title, artist, album, profile
host.trigger.add("MUC user joined", self.userJoinedTrigger)
def createRadiocolElt(self, to_jid, type="normal"):
@ -75,7 +80,7 @@ class Radiocol():
elt["type"] = type
elt.addElement((NC_RADIOCOL, RADIOC_TAG))
return elt
def __create_started_elt(self):
"""Create a game_started domish element"""
started_elt = domish.Element(('','started'))
@ -159,6 +164,48 @@ class Radiocol():
mess.firstChildElement().addChild(self.__create_started_elt())
self.host.profiles[profile].xmlstream.send(mess)
def radiocolSongAdded(self, referee, song_path, profile):
"""This method is called by libervia when a song has been uploaded
@param room_jid_param: jid of the room
@song_path: absolute path of the song added
@param profile_key: %(doc_profile_key)s"""
#XXX: this is a Q&D way for the proof of concept. In the future, the song should
# be streamed to the backend using XMPP file copy
# Here we cheat because we know we are on the same host, and we don't
# check data. Referee will have to parse the song himself to check it
client = self.host.getClient(profile)
if not client:
error(_("Can't access profile's data"))
return
try:
song = OggVorbis(song_path)
except OggVorbisHeaderError:
#this file is not ogg vorbis, we reject it
import pdb
pdb.set_trace()
"""mess = self.createRadiocolElt(jid.JID(referee))
reject_elt = mess.firstChildElement().addElement(('','song_rejected'))
reject_elt['sender'] = client.jid
reject_elt['reason'] = _("Uploaded file is not Ogg Vorbis song, only Ogg Vorbis songs are acceptable")
#FIXME: add an error code
self.host.profiles[profile].xmlstream.send(mess)"""
return
title = song.get("title", ["Unknown"])[0]
artist = song.get("artist", ["Unknown"])[0]
album = song.get("album", ["Unknown"])[0]
length = song.info.length
mess = self.createRadiocolElt(jid.JID(referee))
added_elt = mess.firstChildElement().addElement(('','song_added'))
added_elt['filename'] = os.path.basename(song_path)
added_elt['title'] = title
added_elt['artist'] = artist
added_elt['album'] = album
added_elt['length'] = str(length)
self.host.profiles[profile].xmlstream.send(mess)
return
def radiocol_game_cmd(self, mess_elt, profile):
from_jid = jid.JID(mess_elt['from'])
room_jid = jid.JID(from_jid.userhost())
@ -170,6 +217,22 @@ class Radiocol():
if elt.name == 'started': #new game created
self.host.bridge.radiocolStarted(room_jid.userhost(), from_jid.full(), profile)
elif elt.name == 'preload': #a song is in queue and must be preloaded
self.host.bridge.radiocolPreload(room_jid.userhost(), elt['filename'], elt['title'], elt['artist'], elt['album'], profile)
elif elt.name == 'song_rejected': #a song has been refused
import pdb
pdb.set_trace()
elif elt.name == 'song_added': #a song has been refused
#FIXME: we are KISS for the PoC: every song is added. Need to manage some sort of rules to allow peoples to send songs
mess = self.createRadiocolElt(room_jid)
preload_elt = mess.firstChildElement().addElement(('','preload'))
preload_elt['sender'] = from_jid.resource
preload_elt['filename'] = elt['filename'] #XXX: the frontend should know the temporary directory where file is put
preload_elt['title'] = elt['title']
preload_elt['artist'] = elt['artist']
preload_elt['album'] = elt['album']
preload_elt['length'] = elt['length']
self.host.profiles[profile].xmlstream.send(mess)
else:
error (_('Unmanaged game element: %s') % elt.name)