Aller au contenu

Fibaro Hc2 Vd Sonos Remote: Télécommande Pour Diffuseur Sonos


Krikroff

Messages recommandés

Encore super et bravo :60:  ...je vais tester ça tout de suite !!!

 

Pour ma part, j'utilise principalement le TTS et j'ai essayé plusieurs langues (" Hello my name is the voice"...qu'est-ce qu'on ferait pas pour faire rire ses enfants :) ) ...

 

la voix masculine est dans la liste des nouvelles fonctionnalités ?

Lien vers le commentaire
Partager sur d’autres sites

Chouette une nouvelle version :)

 

Je me doute de la réponse, mais je la pose quand même : est-ce qu'il y a une méthode permettant de remplacer le module virtuel existant sans en importer un nouveau, c'est à  dire éviter d'avoir un nouvel ID ?

Lien vers le commentaire
Partager sur d’autres sites

@Xtrem57, oui c'est exactement cela.

 

@JM13, la voix masculine est une option possible pour une prochaine mise à  jour effectivement ;)

 

@Adam.Bewsher, @Cyssou merci pour vos encouragements :)

 

@Moicphil, je ne veux pas trop m'avancer pour le moment :P

 

@Lazer, non il faut importer comme pour un nouveau vd ou bien mettre a jour manuellement lorsqu'il y a très peu de changement.

 

INFO: Je travail actuellement sur un projet qui justement nous donnera la possibilité de nous affranchir de toutes les contraintes d'importation d'un vd: installation, mise à  jour, dépendances, variables, suppression etc... L’outil devrait être inclus dans une mise à  jour du Toolkit ou bien en Standalone voir les deux...J' avais mis de côté ce projet avec la V4 mais visiblement les vd ont encore de beaux jours devant eux :D

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Je suis impatient de rentrer de vacances pour pouvoir tester 9a.

J'aimerais bien avoir le TTS dessus chez moi.

 

J'ai bien vu la remarque de Lazer, chez moi, je n'ai programmé que deux station préféré. Je ferais le test avec plusieurs.

Lien vers le commentaire
Partager sur d’autres sites

Bon, je viens d'aller voir la concurrence  :) ... je viens de tomber sur un site http://forum.eedomus.com/viewtopic.php?f=13&t=756&start=120 qui parle de SONOS et aussi de TTS.

 

La mise en oeuvre est aussi pas mal ...elle passe par un serveur NAS et un script en PHP qui peut se commander par une requête HTTP simple...donc aussi facilement par un HC2.

 

Ce que je trouve pas mal :

- La possibilité de mettre un petit jingle au début des messages

- la possibilité de créer un fichier mp3 pour chaque message..c'est donc plus rapide lors d'une deuxième exécution

- Si le message est enregistré on n'est pas dépendant d'internet

 

Par contre, il faut un NAS...ok !

 

Bon, je dis ça...je dis rien  :15: ...c'est juste pour énerver un peu Krikroff pendant les vacances  ;) et donner qqles idées. :)

Lien vers le commentaire
Partager sur d’autres sites

Exact j'étais tombé la dessus justement quand j'ai commencé à  m'interesser à  la domotique suite à  l'achat de mes SONOS

http://www.planete-domotique.com/blog/2013/06/10/une-classe-php-pour-piloter-ses-sonos-avec-leedomus/

 

Mais grâce au module de Krikroff j'ai lâché l'affaire bien qu'effectivement ça a l'air pratique pour les fichier mp3 notamment. Mais je n'y connais rien en php et ça parle de mise en partage samba (pas compris...) Mais si ca peut aider le développement futur c'est bien joué d'avoir mis ça sur le tapis JM13!

Lien vers le commentaire
Partager sur d’autres sites

Comment faire pour modifier le volume depuis une scène, ou un autre périphérique virtuel ?

 

J'ai utiliser ca: 

fibaro:call(1812, "setProperty", "ui.slVolume.value", 9);

Cela modifie bien le Slider, mais il revient au même niveau tout de suite après...

L'idée est de pouvoir lancer la radio a un volume faible pour le réveil

Lien vers le commentaire
Partager sur d’autres sites

J'ai récupéré un de tes script "playfile", je voudrai lancer une chanson.

En fin de script je mets :

playFile("//Home_synology/Volume 1/music/Locked Out of Heaven - Bruno Mars.m4a", 20);

Le script se déroule, jusqu'au stop et revient au niveau sonore (mais sans déclencher la chanson). Coté SONOS, il me dit impossible .... car serveur introuvable.

Une idée ?

Lien vers le commentaire
Partager sur d’autres sites

C'est le message d'erreur dans le debug ? Est-ce que le fichier est accessible si tu colles le lien dans vmc par exemple ? J'ai un doute mais il est possible que cela vienne du non encodage du chemin complet du fichier il faut que je Check cela

Lien vers le commentaire
Partager sur d’autres sites

pour encoder l'url voici la metode:

function urlEncode(str)
  if (str) then
    str = string.gsub(str, "\n", "\r\n");
    str = string.gsub(str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub(str, " ", "+");
  end
  return str;
end
Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton retour, j'ai rajouté ton codage comme suit :

if (str) then
    str = string.gsub(str, "\n", "\r\n");
    str = string.gsub(str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub(str, " ", "+");
  end
  return str;
end
 
-- en paramètres: le fichier, puis le volume...
playFile(urlEncode("//Home_synology/Volume 1/music/Locked Out of Heaven - Bruno Mars.m4a"), 20);

En revanche, toujours pareil, en debug, que des lignes blanches (cela semble bien dérouler), mais sonos sort toujours son message d'erreur àl'appel de ce fichier.

Encore merci de ton aide, de ton SAV, de ta maintenance, de tes conseils, bref t'es toujours là... :D

Lien vers le commentaire
Partager sur d’autres sites

C'est le tiens tu me l'avais basardé dans un post antérieur

 
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-- SONOS Play stream...
-- Copyright © 2014 Jean-Christophe Vermandé
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
 
selfId = fibaro:getSelfId();    
ip = fibaro:get(selfId, 'IPAddress') or "192.168.0.31";
port = fibaro:get(selfId, 'TCPPort') or 1400;
currentTransportState = "";
lastTransportState = "";
currentVolume = 0;
lastVolume = 0;
ttsVolumeIsDifferent = false;
 
urlencode = function(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n");
    str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub (str, " ", "+");
  end
  return str;
end
 
createRequestBody = function(action, schema, data)
  return string.format("<u:%s xmlns:u=\"%s\">%s</u:%s>", action, schema, data, action);
end
 
reponseCallback = function(fnc, args)
  if (fnc == nil) then
    return nil;
  end
  return fnc(args);
end
 
createSocket = function()
    -- Check IP and PORT before
  if (ip == nil or port == nil) then
    fibaro:debug("You must configure IPAddress and TCPPort first");
    return;
  end
  local socket;
  local status, err = pcall(function() 
      socket = Net.FTcpSocket(ip, port);
      socket:setReadTimeout(1000);
    end);  
  if (status ~= nil and status ~= true) then
    fibaro:debug("socket status: " .. tostring(status or ''));
  end  
  if (err ~= nil) then
    fibaro:debug("socket err: " .. tostring(err or ''));
    return;
  end
  return socket;
end
 
disposeSocket = function(socket)
  if (socket ~= nil) then
    socket:disconnect();
    socket = nil;
    return true;
  end
  return false;
end
 
sendSoapMessage = function(url, service, action, args, callback, retry)
 
  local socket = createSocket();
  if (socket == nil) then
    return;
  end
  retry = retry or 0
  -- prepare data
  local url = "POST " .. url .. " HTTP/1.1";
  local soapaction = "SOAPACTION: \"" .. service .. "#" .. action.name .. "\"";
  local body = createRequestBody(action.name, action.service, tostring(args or ""));
  local envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>" .. body .. "</s:Body></s:Envelope>";
  local ctl = "Content-Length: " .. string.len(envelope); 
  local payload = url .. "\r\n" .. ctl .. "\r\n" .. soapaction .. "\r\n" .. "\r\n" .. envelope;
  -- write data
  local bytes, errorcode = socket:write(payload);
  if (errorcode == 0) then
    local state, errorcode = socket:read();
    if (errorcode == 0) then
      if (string.len(state or "") > 0) then
        -- callback
        if (callback ~= nil) then
          reponseCallback(callback, state);
        end
        -- dispose ...
        disposeSocket(socket);
        return true;
      else
        fibaro:debug("Error: Invalid response. response length: " .. string.len(state or ""));
      end
    else      
      if (retry < 5) then
        fibaro:debug("retry #"..retry.." action: " .. action.name);
        return sendSoapMessage(url, service, action, args, callback, (retry + 1));
      else
        fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
      end
    end
  elseif (errorcode == 2) then
    fibaro:debug("Error: You must check your IP and PORT settings.");
  else
    if (retry < 5) then
      fibaro:debug("retry #"..retry.." action: " .. action.name);
      return sendSoapMessage(url, service, action, args, callback, (retry + 1));
    else
      fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
    end
  end  
  -- dispose ...
  disposeSocket(socket);
  -- default response
  return false;
end
 
stop = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Stop", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)
      fibaro:debug("stop sent");
    end);    
end
 
unMute = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetMute", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>0</DesiredMute>",
      -- callback (options)
    function(response)
      fibaro:debug("unMute sent");
    end); 
end
 
play = function(duration)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Play", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)   
      if (duration ~= nil) then
        fibaro:debug("play sent for " .. duration .. " seconds");
        fibaro:sleep(duration);
        stop();
      else
        fibaro:debug("play sent");
        local n = 0;
        currentTransportState = "TRANSITIONING";
        while (currentTransportState == "TRANSITIONING") do
          if (n > 10) then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(5000);
          n = n + 1;
        end        
        local i = 0;
        currentTransportState = "PLAYING";
        while (currentTransportState == "PLAYING") do
          if (i > 10) then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(2000);
          i = i + 1;
        end
        fibaro:sleep(1000);
        stop();
      end
      -- update volume with value before tts if different
      if (ttsVolumeIsDifferent == true) then
      	setVolume(lastVolume);
        ttsVolumeIsDifferent = false;
      end
    end);    
end
 
setVolume = function(value)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>" .. tostring(value) .. "</DesiredVolume>",
    -- callback (options)
    function(response)      
      fibaro:debug("Volume set: " .. value);
    end);
end
 
getVolume = function()
  fibaro:log("Get volume, please wait...");
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)    
    "<InstanceID>0</InstanceID><Channel>Master</Channel>",
    -- callback (options)
    function(response)
      currentVolume = tonumber(response:match("<CurrentVolume>(.+)</CurrentVolume>") or 0);    
    end);
end
 
getTransportState = function()
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetTransportInfo", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>",
    -- callback (options)
    function(response)      
      currentTransportState = response:match("<CurrentTransportState>(.+)</CurrentTransportState>") or "";
    end);
end
 
playFile= function(file, volume)
return sendSoapMessage(
-- control url
"/MediaRenderer/AVTransport/Control",
-- service type
"urn:schemas-upnp-org:service:AVTransport:1",
-- action
{ name = "SetAVTransportURI", service = "urn:schemas-upnp-org:service:AVTransport:1" },
-- soap body data (options)
"<InstanceID>0</InstanceID>,<CurrentURI>x-file-cifs:" .. file .. "</CurrentURI>,<CurrentURIMetaData></CurrentURIMetaData>",
-- callback (options)
function(response)
-- retrieve current transport state
getTransportState();
lastTransportState = currentTransportState;
-- unmute before
unMute();
-- retrieve volume
getVolume();
lastVolume = currentVolume;
-- set tts volume if <> with current
if (volume ~= nil and volume ~= currentVolume) then
setVolume(volume);
ttsVolumeIsDifferent = true;
end
 
play();
 
end);
end

function urlEncode(str)
  if (str) then
    str = string.gsub(str, "\n", "\r\n");
    str = string.gsub(str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub(str, " ", "+");
  end
  return str;
end
 
-- en paramètres: le fichier, puis le volume...
playFile(urlEncode("//Home_synology/Volume 1/music/Locked Out of Heaven - Bruno Mars.m4a"), 20);
Lien vers le commentaire
Partager sur d’autres sites

oui j'ai retrouvé le sujet ;) ...

 

je viens de tester le code suivant et tout marche bien chez moi :)

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-- SONOS Play stream...
-- Copyright © 2014 Jean-Christophe Vermandé
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
 
local selfId = fibaro:getSelfId();    
local ip = fibaro:get(selfId, 'IPAddress');
local port = fibaro:get(selfId, 'TCPPort') or 1400;
local currentTransportState = "";
local lastTransportState = "";
local currentVolume = 0;
local lastVolume = 0;
local ttsVolumeIsDifferent = false;

urlencode = function(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n");
    str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub (str, " ", "+");
  end
  return str;
end

createRequestBody = function(action, schema, data)
  return string.format("<u:%s xmlns:u=\"%s\">%s</u:%s>", action, schema, data, action);
end

reponseCallback = function(fnc, args)
  if (fnc == nil) then
    return nil;
  end
  return fnc(args);
end

createSocket = function()
    -- Check IP and PORT before
  if (ip == nil or port == nil) then
    fibaro:debug("You must configure IPAddress and TCPPort first");
    return;
  end
  local socket;
  local status, err = pcall(function() 
      socket = Net.FTcpSocket(ip, port);
      socket:setReadTimeout(1000);
    end);  
  if (status ~= nil and status ~= true) then
    fibaro:debug("socket status: " .. tostring(status or ''));
  end  
  if (err ~= nil) then
    fibaro:debug("socket err: " .. tostring(err or ''));
    return;
  end
  return socket;
end

disposeSocket = function(socket)
  if (socket ~= nil) then
    socket:disconnect();
    socket = nil;
    return true;
  end
  return false;
end

sendSoapMessage = function(url, service, action, args, callback, retry)    
  local socket = createSocket();
  if (socket == nil) then
    return;
  end
  retry = retry or 0
  -- prepare data
  local url = "POST " .. url .. " HTTP/1.1";
  local soapaction = "SOAPACTION: \"" .. service .. "#" .. action.name .. "\"";
  local body = createRequestBody(action.name, action.service, tostring(args or ""));
  local envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>" .. body .. "</s:Body></s:Envelope>";
  local ctl = "Content-Length: " .. string.len(envelope); 
  local payload = url .. "\r\n" .. ctl .. "\r\n" .. soapaction .. "\r\n" .. "\r\n" .. envelope;
  -- write data
  local bytes, errorcode = socket:write(payload);
  if (errorcode == 0) then
    local state, errorcode = socket:read();
    if (errorcode == 0) then
      if (string.len(state or "") > 0) then
        -- callback
        if (callback ~= nil) then
          reponseCallback(callback, state);
        end
        -- dispose ...
        disposeSocket(socket);
        return true;
      else
        fibaro:debug("Error: Invalid response. response length: " .. string.len(state or ""));
      end
    else      
      if (retry < 5) then
        fibaro:debug("retry #"..retry.." action: " .. action.name);
        return sendSoapMessage(url, service, action, args, callback, (retry + 1));
      else
        fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
      end
    end
  elseif (errorcode == 2) then
    fibaro:debug("Error: You must check your IP and PORT settings.");
  else
    if (retry < 5) then
      fibaro:debug("retry #"..retry.." action: " .. action.name);
      return sendSoapMessage(url, service, action, args, callback, (retry + 1));
    else
      fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
    end
  end  
  -- dispose ...
  disposeSocket(socket);
  -- default response
  return false;
end

stop = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Stop", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)
      fibaro:debug("stop sent");
    end);    
end

unMute = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetMute", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>0</DesiredMute>",
      -- callback (options)
    function(response)
      fibaro:debug("unMute sent");
    end); 
end

play = function(duration)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Play", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)   
      if (duration ~= nil) then
        fibaro:debug("play sent for " .. duration .. " seconds");
        fibaro:sleep(duration);
        stop();
      else
        fibaro:debug("play sent");
        local n = 0;
        currentTransportState = "TRANSITIONING";
        while (currentTransportState == "TRANSITIONING") do
          if (n > 15) then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(6000);
          n = n + 1;
        end        
        local i = 0;
        currentTransportState = "PLAYING";
        while (currentTransportState == "PLAYING") do
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(3000);
        end
        fibaro:sleep(500);
        stop();
      end
      -- update volume with value before tts if different
      if (ttsVolumeIsDifferent == true) then
      	setVolume(lastVolume);
        ttsVolumeIsDifferent = false;
      end
    end);    
end

setVolume = function(value)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>" .. tostring(value) .. "</DesiredVolume>",
    -- callback (options)
    function(response)      
      fibaro:debug("Volume set: " .. value);
    end);
end

getVolume = function()
  fibaro:log("Get volume, please wait...");
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)    
    "<InstanceID>0</InstanceID><Channel>Master</Channel>",
    -- callback (options)
    function(response)
      currentVolume = tonumber(response:match("<CurrentVolume>(.+)</CurrentVolume>") or 0);    
    end);
end

getTransportState = function()
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetTransportInfo", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>",
    -- callback (options)
    function(response)      
      currentTransportState = response:match("<CurrentTransportState>(.+)</CurrentTransportState>") or "";
    end);
end
 
playFile= function(file, volume)
  file = urlencode(file);
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "SetAVTransportURI", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>,<CurrentURI>x-file-cifs:" .. file .. "</CurrentURI>,<CurrentURIMetaData></CurrentURIMetaData>",
    -- callback (options)
    function(response)
      -- retrieve current transport state
      getTransportState();
      lastTransportState = currentTransportState;
      -- unmute before
      unMute();
      -- retrieve volume
      getVolume();
      lastVolume = currentVolume;
      -- set tts volume if <> with current
      if (volume ~= nil and volume ~= currentVolume) then
        setVolume(volume);
        ttsVolumeIsDifferent = true;
      end
      -- play
      play();   
    end
  );
end
 
-- en paramètres: le fichier, puis le volume...
playFile("//HOME-SERVER/Musique/CD/Dream Theater/A Change of Seasons/01-A Change of Seasons [Medley].flac", 10); 

As-tu vérifié de ton côté si ton fichier est joignable et lisible depuis par exemple VLC player ?

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...