generation de waveforms si sox dispo
[mw_sourceml] / app / controllers / sources / waveforms.php
diff --git a/app/controllers/sources/waveforms.php b/app/controllers/sources/waveforms.php
new file mode 100644 (file)
index 0000000..eadba06
--- /dev/null
@@ -0,0 +1,203 @@
+<?php
+
+  class mw_sources_waveforms extends mw_controller{
+
+  /*
+  
+    des actions disponibles en ligne de commande pour génerer des waveforms
+    si sox est executable sur le systeme via php
+  
+    ### action make
+    ---------------
+  
+    php cli.php sources/waveforms/make from=http://domaine.archive.tld archive_root=/fs/path/to/archive/ id=<id_source>
+  
+  
+    genere la waveforme de la source d'id <id_source>
+  
+    options :
+  
+      waveform_fg=RRVVBB couleur (notation hexa sans #) de la waveforme
+  
+      waveform_bg=RRVVBB couleur (notation hexa sans #) du fond (par defaut transparent)
+  
+  
+    ### action make_all
+    -------------------
+  
+    php cli.php sources/waveforms/make_all from=http://domaine.archive.tld archive_root=/fs/path/to/archive/
+
+
+    genere toutes les waveformes
+  
+    options :
+  
+      update=1 force la generation même si une image existe deja
+  
+      waveform_fg=RRVVBB couleur (notation hexa sans #) de la waveforme
+  
+      waveform_bg=RRVVBB couleur (notation hexa sans #) du fond (par defaut transparent)
+  
+  */
+
+    function validate(){
+      if(PHP_SAPI != "cli"){
+        return "utilisation en ligne de commande uniquement";
+      }
+      return true;
+    }
+
+    function make(){
+      $env = $this->env();
+      $data = $env->data();
+      $id_source = $_GET[$env->param("id")];
+      $base_url = $_GET[$env->param("from")];
+      $document_root = $_GET[$env->param("archive_root")];
+      $foreground = isset($_GET[$env->param("waveform_fg")]) ? $_GET[$env->param("waveform_fg")] : "383838";
+      $background = isset($_GET[$env->param("waveform_bg")]) ? $_GET[$env->param("waveform_bg")] : null;
+      if(!$data->init_waveform_dirs()){
+        debug("impossible de creer les dossiers pour les waveforms");
+        exit;
+      }
+      if(($source = $data->source($id_source, true)) === false){
+        debug("impossible de lire les informations de la source");
+        exit;
+      }
+      $audio_files = array();
+      $no_files = array();
+      if(isset($source["documents"])){
+        $documents = array(
+          "flac" => false,
+          "wav" => false,
+          "ogg" => false,
+          "mp3" => false
+        );
+        foreach($source["documents"] as $document){
+          $file_name = false;
+          if(substr(urldecode($document["url"]), 0, strlen($base_url)) == $base_url){
+            $file_name = $document_root.substr(urldecode($document["url"]), strlen($base_url));
+            if(!file_exists($file_name)){
+              $file_name = false;
+            }
+          }
+          if($file_name){
+            if(strtolower(substr($document["url"], -5)) === ".flac"){
+              $documents["flac"] = $file_name;
+            }
+            if(strtolower(substr($document["url"], -4)) === ".wav"){
+              $documents["wav"] = $file_name;
+            }
+            if(strtolower(substr($document["url"], -4)) === ".ogg"){
+              $documents["ogg"] = $file_name;
+            }
+            if(strtolower(substr($document["url"], -4)) === ".mp3"){
+              $documents["mp3"] = $file_name;
+            }
+          }
+        }
+        if($documents["flac"]) $audio_files[$source["id"]] = $documents["flac"];
+        elseif($documents["wav"]) $audio_files[$source["id"]] = $documents["wav"];
+        elseif($documents["ogg"]) $audio_files[$source["id"]] = $documents["ogg"];
+        elseif($documents["mp3"]) $audio_files[$source["id"]] = $documents["mp3"];
+        else $no_files[$source["id"]] = $source["titre"];
+      }
+      foreach($audio_files as $id_source => $audio_file){
+        if(
+          !$data->audio_to_png(
+            array(
+              "audio_file" => $audio_file,
+              "png_file" => $env->path("content")."waveforms/".$id_source.".png",
+              "foreground" => "#".$foreground,
+              "background" => $background ? "#".$background : ""
+            )
+          )
+        ){
+          if(!$data->sox_exists()){
+            debug("impossible d'executer la commande sox sur le systeme");
+          }
+          else{
+            debug("impossible de generer le png pour la source id ".$id_source);
+          }
+        }
+      }
+    }
+
+    function make_all(){
+      $env = $this->env();
+      $data = $env->data();
+      $base_url = $_GET[$env->param("from")];
+      $document_root = $_GET[$env->param("archive_root")];
+      $UPDATE = isset($_GET[$env->param("update")]) ? $_GET[$env->param("update")] : false;
+      $foreground = isset($_GET[$env->param("waveform_fg")]) ? $_GET[$env->param("waveform_fg")] : "383838";
+      $background = isset($_GET[$env->param("waveform_bg")]) ? $_GET[$env->param("waveform_bg")] : null;
+      if(!$data->init_waveform_dirs()){
+        debug("impossible de creer les dossiers pour les waveforms");
+        exit;
+      }
+      $sources = $data->sources(array());
+      $audio_files = array();
+      $no_files = array();
+      foreach($sources["list"] as $source){
+        $png_file = $env->path("content")."waveforms/".$source["id"].".png";
+        if(file_exists($png_file) && !$UPDATE) continue;
+        if(isset($source["documents"])){
+          $documents = array(
+            "flac" => false,
+            "wav" => false,
+            "ogg" => false,
+            "mp3" => false
+          );
+          foreach($source["documents"] as $document){
+            $file_name = false;
+            if(substr(urldecode($document["url"]), 0, strlen($base_url)) == $base_url){
+              $file_name = $document_root.substr(urldecode($document["url"]), strlen($base_url));
+              if(!file_exists($file_name)){
+                $file_name = false;
+              }
+            }
+            if($file_name){
+              if(strtolower(substr($document["url"], -5)) === ".flac"){
+                $documents["flac"] = $file_name;
+              }
+              if(strtolower(substr($document["url"], -4)) === ".wav"){
+                $documents["wav"] = $file_name;
+              }
+              if(strtolower(substr($document["url"], -4)) === ".ogg"){
+                $documents["ogg"] = $file_name;
+              }
+              if(strtolower(substr($document["url"], -4)) === ".mp3"){
+                $documents["mp3"] = $file_name;
+              }
+            }
+          }
+          if($documents["flac"]) $audio_files[$source["id"]] = $documents["flac"];
+          elseif($documents["wav"]) $audio_files[$source["id"]] = $documents["wav"];
+          elseif($documents["ogg"]) $audio_files[$source["id"]] = $documents["ogg"];
+          elseif($documents["mp3"]) $audio_files[$source["id"]] = $documents["mp3"];
+          else $no_files[$source["id"]] = $source["titre"];
+        }
+      }
+      foreach($audio_files as $id_source => $audio_file){
+        if(
+          !$data->audio_to_png(
+            array(
+              "audio_file" => $audio_file,
+              "png_file" => $env->path("content")."waveforms/".$id_source.".png",
+              "foreground" => "#".$foreground,
+              "background" => $background ? "#".$background : ""
+            )
+          )
+        ){
+          if(!$data->sox_exists()){
+            debug("impossible d'executer la commande sox sur le systeme");
+          }
+          else{
+            debug("impossible de generer le png pour la source id ".$id_source);
+          }
+        }
+      }
+    }
+
+  }
+
+?>
\ No newline at end of file