libreavous/libreavous_fonctions.php

301 lines
9.1 KiB
PHP

<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function filtre_escape_json($texte) {
return str_replace("\"", "\\\"", str_replace("\n", "\\n", str_replace("\n\n", "\n<br><br>\n", $texte)));
}
function filtre_decode_html($texte) {
return html_entity_decode($texte);
}
function filtre_libreavous_supp_numero($texte) {
$idx = strpos($texte, "-");
return trim(substr($texte, $idx +1));
}
// plutot utiliser la fonction spip taille_en_octets
function libreavous_mio($number) {
$mio = round($number / (1024 * 1024), 1);
if ($mio < 10) {
$mio = round($mio, 2);
return number_format($mio, 2, ',', ' ');
} else if ($mio < 100) {
$mio = round($mio, 1);
return number_format($mio, 1, ',', ' ');
} else {
$mio = round($mio, 0);
return number_format($mio, 0, ',', ' ');
}
return $mio;
}
function titre_chronique_court($titre) {
// annuler le filtre
return $titre;
}
// calculer la durée d'un chapitre
// $start et $end sous form hh:mm:ss
function libreavous_duree($start,$end) {
$timestart = new DateTime($start);
$timeend = new DateTime($end);
$timeduree = $timestart->diff($timeend);
$duree = $timeduree->format('%h h %i min. %s s.');
return $duree;
}
// retirer l'heure si 0 h dans la duree
function libreavous_sanszeroh($chaine) {
$chaine = str_replace('0 h ','',$chaine);
return $chaine;
}
// ajoute un 0 si un seul chiffre (date du jour < à 10)
function libreavous_aveczerod($chaine) {
$chaineaveczero = $chaine;
if (strlen($chaine) == '1') {
$chaineaveczero = '0'.$chaine;
}
return $chaineaveczero;
}
/***************************************
* Importation du JSON des chapitres
* et des autres informations (durée, taille, etc)
***************************************/
function balise_LIBREAVOUS_IMPORT($p) {
$id_article = "''";
if (($v = interprete_argument_balise(1,$p))!==NULL){
$id_article = $v;
}
$p->code = "libreavous_import_run($id_article)";
return $p;
}
function libreavous_import_run($id_article) {
$id_article = intval($id_article);
$existant = sql_select("podcast_code,titre","spip_articles","id_article=".$id_article);
if ($existant and sql_count($existant)>0) {
$r = sql_fetch($existant);
$code_emission = $r["podcast_code"];
$titre_emission = $r["titre"];
if(strlen($code_emission) == 0) {
return "Le code de l'émission n'est pas renseigné";
}
} else {
return "Émission inconnue = ".$id_article;
}
$erreurs = array();
$logs = array();
$json = false;
$podcast_duree = "";
$ogg_size = "";
$mp3_size = "";
try {
$jsonUrl = "https://forge.april.org/libreavous/lav-outils/raw/branch/master/podcasts/config/lav-".$code_emission.".json";
$jsonContents = file_get_contents($jsonUrl);
if ($jsonContents === false) {
$erreurs[] = "Erreur d'accès au fichier JSON :".$jsonUrl;
} else {
$json = json_decode($jsonContents, true);
if (!$json) {
$erreurs[] = "JSON incorrect :".$jsonUrl;
}
}
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
try {
$podcast_duree = libreavous_import_getDuration($code_emission, null);
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
try {
$ogg_size = libreavous_import_getSize($code_emission, null, "ogg");
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
try {
$mp3_size = libreavous_import_getSize($code_emission, null, "mp3");
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
$chapitres = array();
if (array_key_exists("chapters", $json)) {
$chapters = $json["chapters"];
$count = count($chapters);
if ($count > 0) {
$duree_sujetlong = 30 * 60;
$sujetlongIndex = -1;
for($i = 0; $i < $count; $i++) {
$chapter = $chapters[$i];
$chapter["type"] = "";
$debutSecondes = libreavous_import_toSeconde($chapter["start_timestamp"]);
$finSecondes = libreavous_import_toSeconde($chapter["end_timestamp"]);
if ($debutSecondes === false) {
$erreurs[] = "start_timestamp incorrect : ".$chapter["start_timestamp"];
} else if ($finSecondes === false) {
$erreurs[] = "end_timestamp incorrect : ".$chapter["end_timestamp"];
} else if ($debutSecondes == $finSecondes) {
$erreurs[] = "start_timestamp et end_timestamp identiques : ".$chapter["end_timestamp"];
} else {
$duree = $finSecondes - $debutSecondes;
if ($duree > $duree_sujetlong) {
$sujetlongIndex = $i;
$duree_sujetlong = $duree;
}
$chapter["duree"] = $duree;
}
if (!array_key_exists("chapter_title", $chapter)) {
$chapter["chapter_title"] = "";
$erreurs[] = "Titre de chapitre manquant";
}
$chapter["ogg_size"] = "";
$chapter["mp3_size"] = "";
if (!array_key_exists("short_chapter_name", $chapter)) {
$chapter["short_chapter_name"] = "";
$erreurs[] = "Nom de fichier manquant";
} else {
try {
$chapter["ogg_size"] = libreavous_import_getSize($code_emission, $chapter["short_chapter_name"], "ogg");
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
try {
$chapter["mp3_size"] = libreavous_import_getSize($code_emission, $chapter["short_chapter_name"], "mp3");
} catch (Exception $e) {
$erreurs[] = $e->getMessage();
}
}
$chapter["chronique"]="";
$chapitres[] = $chapter;
}
for($i = 0; $i < count($chapitres); $i++) {
if ($i == $sujetlongIndex) {
$chapitres[$i]["type"] = "SL";
} else {
$array = libreavous_import_checkType($chapitres[$i]);
$chapitres[$i]["type"] = $array[0];
if (count($array) > 1) {
$chapitres[$i]["chronique"] = $array[1];
}
}
}
}
}
$emissionArray = array(
'podcast_duree' =>$podcast_duree,
'podcast_mp3' => $mp3_size,
'podcast_ogg' => $ogg_size
);
$logs[] = sql_updateq("spip_articles", $emissionArray, "id_article=".$id_article,'','',false);
sql_updateq("spip_articles", $emissionArray, "id_article=".$id_article);
foreach ($chapitres as $chapitre) {
$code_chapitre = $chapitre["short_chapter_name"];
$chapitreArray = array(
'titre' => $chapitre["chapter_title"],
'code' => $code_chapitre,
'id_article' => $id_article,
'code_fichier' => $chapitre["short_chapter_name"],
'code_podcast' => $code_emission,
'debut' => $chapitre["start_timestamp"],
'fin' => $chapitre["end_timestamp"],
'type_sujet' => $chapitre["type"],
'chronique' => $chapitre["chronique"],
'mp3' => $chapitre["mp3_size"],
'ogg' => $chapitre["ogg_size"]
);
$chapitreExistant = sql_select("id_chapitre","spip_chapitres",array("id_article=".$id_article, "code=".sql_quote($code_chapitre)));
if ($chapitreExistant and sql_count($chapitreExistant)>0) {
$r = sql_fetch($chapitreExistant);
$id_chapitre = $r["id_chapitre"];
$logs[] = sql_updateq("spip_chapitres", $chapitreArray, "id_chapitre=".$id_chapitre,'','',false);
sql_updateq("spip_chapitres", $chapitreArray, "id_chapitre=".$id_chapitre);
} else {
$logs[] = sql_insertq("spip_chapitres", $chapitreArray, '', '', false);
$id_nouveau_chapitre = sql_insertq("spip_chapitres", $chapitreArray);
}
}
$texteReponse = "<p>Émission traitée : ". $code_emission." / ".$titre_emission."</p>";
if (count($erreurs) > 0) {
$texteReponse .= "<h2>Erreurs</h2>";
$texteReponse .= "<ul>";
foreach ($erreurs as $erreur) {
$texteReponse .= "<li><p>".$erreur."</p></li>";
}
$texteReponse .= "</ul>";
}
if (count($logs) > 0) {
$texteReponse .= "<h2>Requêtes effectuées</h2>";
$texteReponse .= "<ul>";
foreach ($logs as $log) {
$texteReponse .= "<li><p>".$log."</p></li>";
}
$texteReponse .= "</ul>";
}
return $texteReponse;
}
function libreavous_import_getDuration($code_emission, $code_sujet) {
$fileName = "libre-a-vous-".$code_emission;
if ($code_sujet) {
$fileName .= "-".$code_sujet;
}
$fileName .= ".ogg.duration";
return libreavous_import_getMediaFileContent($code_emission, $fileName);
}
function libreavous_import_getSize($code_emission, $code_sujet, $extension) {
$fileName = "libre-a-vous-".$code_emission;
if ($code_sujet) {
$fileName .= "-".$code_sujet;
}
$fileName .= ".".$extension.".size";
return libreavous_import_getMediaFileContent($code_emission, $fileName);
}
function libreavous_import_getMediaFileContent($code, $fileName) {
$url = "https://media.april.org/audio/radio-cause-commune/libre-a-vous/emissions/".$code."/".$fileName;
$contents = file_get_contents($url);
$resultat = trim($contents);
if (strlen($resultat) == 0) {
throw new Exception("Fichier manquant ou vide : ".$url);
}
return $resultat;
}
function libreavous_import_toSeconde($time) {
$test = preg_match('/^(\d+):(\d+):(\d+)/', $time, $matches);
if ($test !== false) {
return ($matches[1] * 60 * 60) + ($matches[2] * 60) + ($matches[3]);
} else {
return false;
}
}
function libreavous_import_checkType($chapitre) {
$code = $chapitre["short_chapter_name"];
$result = array();
if ($code == "annonces") {
$result[] = "AN";
} else {
$idx = strpos($code, "chronique-");
if ($idx === 0) {
$result[] = "CH";
$nom_chronique = substr($code, strlen("chronique-"));
$result[] = $nom_chronique;
} else {
$result[] = "SC";
}
}
return $result;
}