Sylchauf / sonos

Plugin SONOS pour SARAH
4 stars 2 forks source link

Reprise de la lecture d'une playlist #15

Open tchex opened 10 years ago

tchex commented 10 years ago

Bonjour, Je rencontre un problème avec les playlists : Lorsque une playlist (de musiques en streaming via napster dans mon cas) est en cours (en lecture ou en pause) et que je demande une info à Sarah :

En parallèle du plugin SONOS SARAH j'utilise un script php pour faire du TTS sur Sonos. Il fonctionne bien, donc si ça peut aider il est là

et plus précisément la fonction playTTS

/**
* Play a TTS message
* @param string message
* @param string radio name display on sonos controller
* @param int volume
* @param string language
*/
public function PlayTTS($message,$directory,$volume=0,$unmute=0,$lang='fr')
{
    $actual['track'] = $this->GetPositionInfo();
    $actual['volume'] = $this->GetVolume();
    $actual['mute'] = $this->GetMute();
    $actual['status'] = $this->GetTransportInfo();
    $this->Pause();

    if ($unmute == 1)
        $this->SetMute(0);
    if ($volume != 0)
        $this->SetVolume($volume);

    $file = 'x-file-cifs://'.$directory.'/'.$this->TTSToMp3($message,$lang);

    if (((stripos($actual['track']["TrackURI"],"x-file-cifs://")) != false) or ((stripos($actual['track']["TrackURI"],".mp3")) != false))
    {
        // It's a MP3 file
        $TrackNumber = $this->AddURIToQueue($file);
        $this->ChangeTrack($TrackNumber);
        $this->Play();
        sleep(2);
        while ($this->GetTransportInfo() == "PLAYING") {}
        $this->Pause();
        $this->SetVolume($actual['volume']);
        $this->SetMute($actual['mute']);
        $this->ChangeTrack($actual['track']["TrackNumberInQueue"]);
        $this->SeekTime($actual['track']["RelTime"]);
        $this->RemoveTrackFromQueue($TrackNumber);
    }
    else
    {
        //It's a radio / or TV (playbar) / or nothing
        $this->SetQueue($file);
        $this->Play();
        sleep(2);
        while ($this->GetTransportInfo() == "PLAYING") {}
        $this->Pause();
        $this->SetVolume($actual['volume']);
        $this->SetMute($actual['mute']);
        $this->SetQueue($actual['track']["TrackURI"]);
    }

    if (strcmp($actual['status'],"PLAYING") == 0)
        $this->Play();
    return true;
}

En tous cas chapeau pour votre travail ! c'est vraiment génial de pouvoir contrôler sonos avec la voix et faire parler sarah sur sonos !

lbouriez commented 10 years ago

Bon, qui se dévoue pour un essai gratuit sur napster^^ ? Moi je ne file pas ma CB ! Edit: Je viens d'effectuer un test avec une playlist gg music, ca marche nickel. Si c'est le mix j'ai de la chance il reprends une nouvelle chanson, si c'est une playlist à moi il continu là ou il était arrêté.

tchex commented 10 years ago

Je vais déjà réessayer avec un mp3 local, une playlist locale, une radio en streaming pour voir ce que ça donne. Je vous dis rapidement.

tchex commented 10 years ago

Bonjour,

Je me suis permis de recoder la fonction callBackToSonos car elle ne fonctionnait pas correctement chez moi.

Pouvez-vous tester de votre côté ? merci

function callBackToSonos(message, lieu) {
    console.log('CallBack To Sonos '+lieu+' requested : '+message);
    // on genere le tts en wav
    var exec = require('child_process').exec;

    child = exec('cd plugins/sonos & ttstowav.vbs "'+message.replace(/[^a-zA-Z0-9éçè@êàâû€$£ù \.,()!:;'#-_^%*]/g, "")+'"',
      function (error, stdout, stderr) {
        if (error !== null) {
          console.log('exec error: ' + error);
        }
        else {
            var wavefile = 'http://'+configSarah.http.ip+':'+configSarah.http.port+'/assets/sonos/tempvoice.wav'
            getTopology(function(){
                // on récupère le volume actuel
                getVolume(function(volumeinit) {
                    // On récupère le statut de lecture du sonos 
                    GetTransportStatus (function(statusbefore) {
                        console.log('StatusBefore : '+statusbefore);
                        GetMediaInfo(function(media) {
                            GetInfosPosition(function(position) {
                            //console.log('trackuri : '+position.trackuri);
                            //console.log('tracknumber : '+position.tracknumber);
                            //console.log('trackreltime : '+position.reltime);
                                Pause(function () {
                                    setVolume(configSonosPerso.volumeAnnonce, function () {
                                        if(position.trackuri.match(new RegExp('x-file-cifs://(.*?)')) !=null || position.trackuri.match(new RegExp('npsdy:(.*?)')) !=null) {
                                            // mp3 file ou steaming Napster (npsdy)
                                            // ajoute le fichier wav à la fin de la liste de lecture
                                            AddURIToQueue(wavefile,function(wavetracknumber) {
                                                // va a la fin de la liste de lecture
                                                Seek('TRACK_NR', wavetracknumber, function() {
                                                    // lis la piste (le fichier wav)
                                                    Play(function() {
                                                        //attend la fin de la lecture du fichier wav
                                                        waitTheEndPlay(function() {
                                                            setVolume(volumeinit, function () {
                                                                // retourne sur la piste précedement lue
                                                                Seek('TRACK_NR', position.tracknumber, function() {
                                                                    // retourne à la position dans la piste précédement lue
                                                                    Seek('REL_TIME', position.reltime, function() {
                                                                        // retire le fichier wav de la liste de lecture
                                                                        RemoveTrackFromQueue(wavetracknumber, function() {
                                                                            // relance (ou pas) la lecture selon le statut d'origine
                                                                            if (statusbefore != 'STOPPED' && statusbefore != 'PAUSED_PLAYBACK') {
                                                                                Play(function() {
                                                                                console.log('CallBack To Sonos ended - I put the music back on .. (mp3 or streaming)');
                                                                                return;
                                                                                });
                                                                            }
                                                                            else {
                                                                                console.log('CallBack To Sonos ended - I keep music paused .. (mp3 or streaming)');
                                                                                return;
                                                                            }
                                                                        });
                                                                    });
                                                                });
                                                            });
                                                        });
                                                    });
                                                });
                                            });
                                        }
                                        else {
                                            //It's a radio / or TV (playbar) / or nothing
                                            SetQueue(wavefile,function() {
                                                Play(function() {
                                                    waitTheEndPlay(function() {
                                                        setVolume(volumeinit, function () {
                                                            SetQueue(position.trackuri,function() {
                                                                if (statusbefore != 'STOPPED' && statusbefore != 'PAUSED_PLAYBACK') {
                                                                    Play(function() {
                                                                    console.log(''CallBack To Sonos ended - I put the music back on .. (radio)'');
                                                                    return;
                                                                    });
                                                                }
                                                                else {
                                                                    console.log('CallBack To Sonos ended - I keep music paused .. (radio)');
                                                                    return;
                                                                }
                                                            });
                                                        });
                                                    });
                                                });
                                            });
                                        }
                                    });
                                });
                            });
                        });
                    });
                }); 
            });
        }
    });
}