waveforms pour les sources de type reference
[mw_sourceml] / app / controllers / sources / waveforms.php
1 <?php
2
3   class mw_sources_waveforms extends mw_controller{
4
5   /*
6   
7     des actions disponibles en ligne de commande pour génerer des waveforms
8     si sox est executable sur le systeme via php
9   
10     ### action make
11     ---------------
12   
13     php cli.php sources/waveforms/make from=http://domaine.archive.tld archive_root=/fs/path/to/archive/ id=<id_source>
14   
15   
16     genere la waveforme de la source d'id <id_source>
17   
18     options :
19   
20       waveform_fg=RRVVBB couleur (notation hexa sans #) de la waveforme
21   
22       waveform_bg=RRVVBB couleur (notation hexa sans #) du fond (par defaut transparent)
23   
24   
25     ### action make_all
26     -------------------
27   
28     php cli.php sources/waveforms/make_all from=http://domaine.archive.tld archive_root=/fs/path/to/archive/
29
30
31     genere toutes les waveformes
32   
33     options :
34   
35       update=1 force la generation même si une image existe deja
36   
37       waveform_fg=RRVVBB couleur (notation hexa sans #) de la waveforme
38   
39       waveform_bg=RRVVBB couleur (notation hexa sans #) du fond (par defaut transparent)
40   
41   */
42
43     function validate(){
44       if(PHP_SAPI != "cli"){
45         return "utilisation en ligne de commande uniquement";
46       }
47       return true;
48     }
49
50     function make(){
51       $env = $this->env();
52       $data = $env->data();
53       $id_source = $_GET[$env->param("id")];
54       $base_url = $_GET[$env->param("from")];
55       $document_root = $_GET[$env->param("archive_root")];
56       $foreground = isset($_GET[$env->param("waveform_fg")]) ? $_GET[$env->param("waveform_fg")] : "383838";
57       $background = isset($_GET[$env->param("waveform_bg")]) ? $_GET[$env->param("waveform_bg")] : null;
58       if(!$data->init_waveform_dirs()){
59         debug("impossible de creer les dossiers pour les waveforms");
60         exit;
61       }
62       if(($source = $data->source($id_source, true)) === false){
63         debug("impossible de lire les informations de la source");
64         exit;
65       }
66       $audio_files = array();
67       $no_files = array();
68       if(isset($source["documents"])){
69         $documents = array(
70           "flac" => false,
71           "wav" => false,
72           "ogg" => false,
73           "mp3" => false
74         );
75         $source_documents = $source["reference"] ? $source["reference"]["documents"] : $source["documents"];
76         foreach($source_documents as $document){
77           $file_name = false;
78           if(substr(urldecode($document["url"]), 0, strlen($base_url)) == $base_url){
79             $file_name = $document_root.substr(urldecode($document["url"]), strlen($base_url));
80             if(!file_exists($file_name)){
81               $file_name = false;
82             }
83           }
84           if($file_name){
85             if(strtolower(substr($document["url"], -5)) === ".flac"){
86               $documents["flac"] = $file_name;
87             }
88             if(strtolower(substr($document["url"], -4)) === ".wav"){
89               $documents["wav"] = $file_name;
90             }
91             if(strtolower(substr($document["url"], -4)) === ".ogg"){
92               $documents["ogg"] = $file_name;
93             }
94             if(strtolower(substr($document["url"], -4)) === ".mp3"){
95               $documents["mp3"] = $file_name;
96             }
97           }
98         }
99         if($documents["flac"]) $audio_files[$source["id"]] = $documents["flac"];
100         elseif($documents["wav"]) $audio_files[$source["id"]] = $documents["wav"];
101         elseif($documents["ogg"]) $audio_files[$source["id"]] = $documents["ogg"];
102         elseif($documents["mp3"]) $audio_files[$source["id"]] = $documents["mp3"];
103         else $no_files[$source["id"]] = $source["titre"];
104       }
105       foreach($audio_files as $id_source => $audio_file){
106         if(
107           !$data->audio_to_png(
108             array(
109               "audio_file" => $audio_file,
110               "png_file" => $env->path("content")."waveforms/".$id_source.".png",
111               "foreground" => "#".$foreground,
112               "background" => $background ? "#".$background : ""
113             )
114           )
115         ){
116           if(!$data->sox_exists()){
117             debug("impossible d'executer la commande sox sur le systeme");
118           }
119           else{
120             debug("impossible de generer le png pour la source id ".$id_source);
121           }
122         }
123       }
124     }
125
126     function make_all(){
127       $env = $this->env();
128       $data = $env->data();
129       $base_url = $_GET[$env->param("from")];
130       $document_root = $_GET[$env->param("archive_root")];
131       $UPDATE = isset($_GET[$env->param("update")]) ? $_GET[$env->param("update")] : false;
132       $foreground = isset($_GET[$env->param("waveform_fg")]) ? $_GET[$env->param("waveform_fg")] : "383838";
133       $background = isset($_GET[$env->param("waveform_bg")]) ? $_GET[$env->param("waveform_bg")] : null;
134       if(!$data->init_waveform_dirs()){
135         debug("impossible de creer les dossiers pour les waveforms");
136         exit;
137       }
138       $sources = $data->sources(array());
139       $audio_files = array();
140       $no_files = array();
141       foreach($sources["list"] as $source){
142         $png_file = $env->path("content")."waveforms/".$source["id"].".png";
143         if(file_exists($png_file) && !$UPDATE) continue;
144         if(isset($source["documents"])){
145           $documents = array(
146             "flac" => false,
147             "wav" => false,
148             "ogg" => false,
149             "mp3" => false
150           );
151           $source_documents = $source["reference"] ? $source["reference"]["documents"] : $source["documents"];
152           foreach($source_documents as $document){
153             $file_name = false;
154             if(substr(urldecode($document["url"]), 0, strlen($base_url)) == $base_url){
155               $file_name = $document_root.substr(urldecode($document["url"]), strlen($base_url));
156               if(!file_exists($file_name)){
157                 $file_name = false;
158               }
159             }
160             if($file_name){
161               if(strtolower(substr($document["url"], -5)) === ".flac"){
162                 $documents["flac"] = $file_name;
163               }
164               if(strtolower(substr($document["url"], -4)) === ".wav"){
165                 $documents["wav"] = $file_name;
166               }
167               if(strtolower(substr($document["url"], -4)) === ".ogg"){
168                 $documents["ogg"] = $file_name;
169               }
170               if(strtolower(substr($document["url"], -4)) === ".mp3"){
171                 $documents["mp3"] = $file_name;
172               }
173             }
174           }
175           if($documents["flac"]) $audio_files[$source["id"]] = $documents["flac"];
176           elseif($documents["wav"]) $audio_files[$source["id"]] = $documents["wav"];
177           elseif($documents["ogg"]) $audio_files[$source["id"]] = $documents["ogg"];
178           elseif($documents["mp3"]) $audio_files[$source["id"]] = $documents["mp3"];
179           else $no_files[$source["id"]] = $source["titre"];
180         }
181       }
182       foreach($audio_files as $id_source => $audio_file){
183         if(
184           !$data->audio_to_png(
185             array(
186               "audio_file" => $audio_file,
187               "png_file" => $env->path("content")."waveforms/".$id_source.".png",
188               "foreground" => "#".$foreground,
189               "background" => $background ? "#".$background : ""
190             )
191           )
192         ){
193           if(!$data->sox_exists()){
194             debug("impossible d'executer la commande sox sur le systeme");
195           }
196           else{
197             debug("impossible de generer le png pour la source id ".$id_source);
198           }
199         }
200       }
201     }
202
203   }
204
205 ?>