plugin radiocol: songs are deleted once played (Q&D need to be reworked once file are properly transfered to server)
This commit is contained in:
parent
c6caa019c8
commit
37d30b7aac
1 changed files with 21 additions and 17 deletions
|
|
@ -21,20 +21,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
from logging import debug, info, warning, error
|
||||
from twisted.words.xish import domish
|
||||
from twisted.internet import protocol, defer, threads, reactor
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream
|
||||
from twisted.words.protocols.jabber import error as jab_error
|
||||
from twisted.words.protocols.jabber.xmlstream import IQ
|
||||
import random
|
||||
from twisted.internet import reactor
|
||||
from twisted.words.protocols.jabber import jid
|
||||
|
||||
from wokkel import disco, iwokkel
|
||||
|
||||
from zope.interface import implements
|
||||
|
||||
from wokkel import disco, iwokkel, data_form
|
||||
from sat.tools.xml_tools import dataForm2xml
|
||||
from sat.tools.games import TarotCard
|
||||
|
||||
from time import time
|
||||
import os.path
|
||||
from os import unlink
|
||||
from mutagen.oggvorbis import OggVorbis, OggVorbisHeaderError
|
||||
|
||||
try:
|
||||
|
|
@ -172,9 +167,7 @@ class Radiocol():
|
|||
error ('Internal error')
|
||||
return
|
||||
referee = room_jid.userhost() + '/' + room_nick
|
||||
status = {}
|
||||
occupants_data = {}
|
||||
self.radios[room_jid.userhost()] = {'referee':referee, 'queue':[], 'upload':True, 'playing': False, 'occupants_data':occupants_data}
|
||||
self.radios[room_jid.userhost()] = {'referee':referee, 'queue':[], 'upload':True, 'playing': False, 'occupants_data':{}, 'to_delete':{}}
|
||||
mess = self.createRadiocolElt(jid.JID(room_jid.userhost()))
|
||||
mess.firstChildElement().addChild(self.__create_started_elt())
|
||||
self.host.profiles[profile].xmlstream.send(mess)
|
||||
|
|
@ -196,6 +189,7 @@ class Radiocol():
|
|||
song = OggVorbis(song_path)
|
||||
except OggVorbisHeaderError:
|
||||
#this file is not ogg vorbis, we reject it
|
||||
unlink(song_path) # FIXME: same host trick (see note above)
|
||||
self.host.bridge.radiocolSongRejected(jid.JID(referee).userhost(), \
|
||||
"Uploaded file is not Ogg Vorbis song, only Ogg Vorbis songs are acceptable", profile)
|
||||
"""mess = self.createRadiocolElt(jid.JID(referee))
|
||||
|
|
@ -211,13 +205,15 @@ class Radiocol():
|
|||
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['filename'] = 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
|
||||
|
||||
radio_data = self.radios[jid.JID(referee).userhost()] #FIXME: referee comes from Libervia's client side, it's unsecure
|
||||
radio_data['to_delete'][filename] = song_path #FIXME: works only because of the same host trick, see the note under the docstring
|
||||
|
||||
def playNext(self, room_jid, profile):
|
||||
""""Play next sont in queue if exists, and put a timer
|
||||
|
|
@ -225,6 +221,7 @@ class Radiocol():
|
|||
#TODO: need to check that there are still peoples in the room
|
||||
# and clean the datas/stop the playlist if it's not the case
|
||||
#TODO: songs need to be erased once played or found invalids
|
||||
# ==> unlink done the Q&D way with the same host trick (see above)
|
||||
radio_data = self.radios[room_jid.userhost()]
|
||||
queue = radio_data['queue']
|
||||
if not queue:
|
||||
|
|
@ -245,8 +242,15 @@ class Radiocol():
|
|||
self.host.profiles[profile].xmlstream.send(mess)
|
||||
radio_data['upload'] = True
|
||||
|
||||
print ("Playing next song in %s s" % length)
|
||||
reactor.callLater(length, self.playNext, room_jid, profile)
|
||||
try:
|
||||
file_to_delete = radio_data['to_delete'][filename]
|
||||
except KeyError:
|
||||
error(_("INTERNAL ERROR: can't find full path of the song to delete"))
|
||||
return
|
||||
|
||||
#we wait more than the song length to delete the file, to manage poorly reactive networks/clients
|
||||
reactor.callLater(length + 90, unlink, file_to_delete) #FIXME: same host trick (see above)
|
||||
|
||||
|
||||
def radiocol_game_cmd(self, mess_elt, profile):
|
||||
|
|
@ -267,7 +271,7 @@ class Radiocol():
|
|||
elif elt.name == 'play':
|
||||
self.host.bridge.radiocolPlay(room_jid.userhost(), elt['filename'], profile)
|
||||
elif elt.name == 'song_rejected': #a song has been refused
|
||||
self.host.bridge.radiocolSongRejected(jid.JID(referee).userhost(), elt['reason'], profile)
|
||||
self.host.bridge.radiocolSongRejected(room_jid.userhost(), elt['reason'], profile)
|
||||
elif elt.name == 'no_upload':
|
||||
self.host.bridge.radiocolNoUpload(room_jid.userhost(), profile)
|
||||
elif elt.name == 'upload_ok':
|
||||
|
|
|
|||
Loading…
Reference in a new issue