JM13 Posté(e) le 7 août 2014 Signaler Posté(e) le 7 août 2014 Encore super et bravo ...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 ?
adam.bewsher Posté(e) le 7 août 2014 Signaler Posté(e) le 7 août 2014 Fantastique, bien fait! C'est un grand périphérique virtuel. Adam Bewsher Fibaro UK
Moicphil Posté(e) le 7 août 2014 Signaler Posté(e) le 7 août 2014 Félicitations Jc ! J'ai hâte de voir les futures nouveautés !!! Tu nous fais un p'tit teasing ?
Lazer Posté(e) le 7 août 2014 Signaler Posté(e) le 7 août 2014 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 ?
Krikroff Posté(e) le 7 août 2014 Auteur Signaler Posté(e) le 7 août 2014 @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 @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 1
Lazer Posté(e) le 7 août 2014 Signaler Posté(e) le 7 août 2014 ah au moins on a du teasing sur le toolkit Merci Krikroff:
DeuxG Posté(e) le 8 août 2014 Signaler Posté(e) le 8 août 2014 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.
JM13 Posté(e) le 9 août 2014 Signaler Posté(e) le 9 août 2014 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 ...c'est juste pour énerver un peu Krikroff pendant les vacances et donner qqles idées.
Tomzebest Posté(e) le 9 août 2014 Signaler Posté(e) le 9 août 2014 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!
xtrem57 Posté(e) le 15 août 2014 Signaler Posté(e) le 15 août 2014 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
Krikroff Posté(e) le 15 août 2014 Auteur Signaler Posté(e) le 15 août 2014 Tu peux essayer avec ceci: local vol = 50; fibaro:setGlobal("SonosLastCmd", tostring(fibaro:getGlobalValue("SonosLastCmd").."VOL"..vol.." ")); ?
Krikroff Posté(e) le 16 août 2014 Auteur Signaler Posté(e) le 16 août 2014 Heureusement sinon j'étais mal 1
Rem's Posté(e) le 16 août 2014 Signaler Posté(e) le 16 août 2014 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 ?
Krikroff Posté(e) le 16 août 2014 Auteur Signaler Posté(e) le 16 août 2014 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
Krikroff Posté(e) le 16 août 2014 Auteur Signaler Posté(e) le 16 août 2014 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
Rem's Posté(e) le 16 août 2014 Signaler Posté(e) le 16 août 2014 Ok super, mais je le colle ou ... A part où je pense !!! (Lol)
Krikroff Posté(e) le 16 août 2014 Auteur Signaler Posté(e) le 16 août 2014 playFile(urlEncode("//Home_synology/Volume 1/music/Locked Out of Heaven - Bruno Mars.m4a"), 20); Cela devrait faire l'affaire
Rem's Posté(e) le 17 août 2014 Signaler Posté(e) le 17 août 2014 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à...
Krikroff Posté(e) le 17 août 2014 Auteur Signaler Posté(e) le 17 août 2014 Je pense qu'il manque un bout dans ton copier/coller non ? Mais au fait le code du playFile sort d’où ?
Rem's Posté(e) le 17 août 2014 Signaler Posté(e) le 17 août 2014 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);
Krikroff Posté(e) le 17 août 2014 Auteur Signaler Posté(e) le 17 août 2014 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 ?
Moicphil Posté(e) le 17 août 2014 Signaler Posté(e) le 17 août 2014 Bonjour Perso, pour jouer un mp3 hebergé sur mon syno, je ne mets pas "volume1" dans le chemin d'accés... Peut etre une piste ? playFile(urlEncode("//Home_synology/music/Locked Out of Heaven - Bruno Mars.m4a"), 20);
Krikroff Posté(e) le 17 août 2014 Auteur Signaler Posté(e) le 17 août 2014 Salut Phil Désolé mais je ne comprends pas bien "je ne mets pas "volume1" dans le chemin d'accés..."
Messages recommandés