170 lines
7.0 KiB
PHP
Raw Normal View History

2025-01-15 11:44:34 +01:00
<?php
// Inclusion de la bibliothèque getID3
require_once('getid3/getid3.php');
// Configuration du podcast
$config = [
'title' => 'Divan dit vent',
'description' => 'Installez-vous confortablement et laissez-vous emporter par les discussions animées du Divan dit vent. Le podcast audio de l\'association Camélia Studio vous invite à explorer les mondes fantastiques de la japanimation et bien plus encore. Plongez dans des critiques passionnées des dernières séries et films d\'animation, tout en découvrant des interviews exclusives avec des experts et des passionnés des différentes facettes de la culture. Avec chaque épisode, embarquez pour un voyage au pays de la créativité et de l\'imagination, où les voix des artistes et des fans se mêlent pour créer une symphonie culturelle captivante.',
'website' => 'https://camelia-studio.org/branches/divan-dit-vent/',
'author' => 'Camélia Studio',
'email' => 'contact.c.a@camelia-studio.org',
'category' => 'Animation & Interviews',
'copyright' => date('Y'),
'language' => 'fr-fr',
'image_url' => 'https://camelia-studio.org/branches/divan-dit-vent/img/logo.png',
'mp3_directory' => '/var/www/camelia-studio.org/branches/divan-dit-vent/mp3/',
'mp3_web_path' => 'https://camelia-studio.org/branches/divan-dit-vent/mp3/'
];
// Entêtes pour le XML
header('Content-Type: application/xml; charset=utf-8');
// Fonction pour obtenir les métadonnées d'un fichier MP3
function getMp3Metadata($file) {
$getID3 = new getID3();
$fileInfo = $getID3->analyze($file);
getid3_lib::CopyTagsToComments($fileInfo);
$metadata = [
'title' => '',
'artist' => '',
'album' => '',
'duration' => '',
'description' => ''
];
// Récupération du titre
if (!empty($fileInfo['comments']['title'][0])) {
$metadata['title'] = $fileInfo['comments']['title'][0];
} else {
// Utiliser le nom du fichier si pas de titre
$metadata['title'] = pathinfo($file, PATHINFO_FILENAME);
}
// Récupération de l'artiste
if (!empty($fileInfo['comments']['artist'][0])) {
$metadata['artist'] = $fileInfo['comments']['artist'][0];
}
// Récupération de la description depuis le commentaire
if (!empty($fileInfo['comments']['comment'][0])) {
$metadata['description'] = $fileInfo['comments']['comment'][0];
}
// Formatage de la durée
if (!empty($fileInfo['playtime_seconds'])) {
$duration = $fileInfo['playtime_seconds'];
$metadata['duration'] = sprintf('%02d:%02d:%02d',
($duration/3600),
($duration/60%60),
$duration%60
);
}
return $metadata;
}
// Ancienne fonction pour la compatibilité si getID3 n'est pas disponible
function getMp3Duration($file) {
$mp3file = fopen($file, "rb");
$block = fread($mp3file, 100);
$mp3info = array();
if (substr($block, 0, 3) == "ID3") {
// Fichier avec ID3v2
fseek($mp3file, 6);
$block = fread($mp3file, 4);
$header_size = unpack('N', $block);
fseek($mp3file, $header_size[1] + 10);
}
do {
$block = fread($mp3file, 10);
if (feof($mp3file)) break;
if (substr($block, 0, 1) == chr(255)) {
$byte = ord(substr($block, 1, 1));
if ($byte >= 224) {
$mp3info['version'] = ($byte & 24) >> 3;
$mp3info['layer'] = ($byte & 6) >> 1;
$mp3info['bitrate'] = ord(substr($block, 2, 1)) >> 4;
$mp3info['sampling_rate'] = (ord(substr($block, 2, 1)) & 15) >> 2;
break;
}
}
} while (true);
fclose($mp3file);
// Calcul approximatif de la durée
$duration = (filesize($file) * 8) / (($mp3info['bitrate'] + 1) * 1000);
return sprintf('%02d:%02d:%02d', ($duration/3600), ($duration/60%60), $duration%60);
}
// Création du XML
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<?xml-stylesheet type="text/xml" href="podcast.xml"?>' . "\n";
?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
<channel>
<title><?php echo htmlspecialchars($config['title']); ?></title>
<description><?php echo htmlspecialchars($config['description']); ?></description>
<link><?php echo htmlspecialchars($config['website']); ?></link>
<language><?php echo htmlspecialchars($config['language']); ?></language>
<copyright>Copyright <?php echo htmlspecialchars($config['copyright']); ?></copyright>
<itunes:subtitle><?php echo htmlspecialchars($config['description']); ?></itunes:subtitle>
<itunes:author><?php echo htmlspecialchars($config['author']); ?></itunes:author>
<itunes:summary><?php echo htmlspecialchars($config['description']); ?></itunes:summary>
<itunes:owner>
<itunes:name><?php echo htmlspecialchars($config['author']); ?></itunes:name>
<itunes:email><?php echo htmlspecialchars($config['email']); ?></itunes:email>
</itunes:owner>
<itunes:image href="<?php echo htmlspecialchars($config['image_url']); ?>"/>
<itunes:category text="<?php echo htmlspecialchars($config['category']); ?>"/>
<?php
// Scan du dossier MP3
$mp3_files = glob($config['mp3_directory'] . '*.mp3');
usort($mp3_files, function($a, $b) {
return filemtime($b) - filemtime($a);
});
foreach ($mp3_files as $mp3_file) {
$filename = basename($mp3_file);
$file_url = $config['mp3_web_path'] . rawurlencode($filename);
$file_size = filesize($mp3_file);
// Récupération des métadonnées
try {
$metadata = getMp3Metadata($mp3_file);
$title = $metadata['title'];
$duration = $metadata['duration'];
$description = $metadata['description'];
} catch (Exception $e) {
// Fallback si getID3 n'est pas disponible
$title = pathinfo($filename, PATHINFO_FILENAME);
$duration = getMp3Duration($mp3_file);
$description = "Épisode : " . $title;
}
$pub_date = date('r', filemtime($mp3_file));
?>
<item>
<title><?php echo htmlspecialchars($title); ?></title>
<description>Épisode : <?php echo htmlspecialchars($title); ?></description>
<pubDate><?php echo $pub_date; ?></pubDate>
<enclosure
url="<?php echo htmlspecialchars($file_url); ?>"
length="<?php echo $file_size; ?>"
type="audio/mpeg"/>
<guid><?php echo htmlspecialchars($file_url); ?></guid>
<itunes:duration><?php echo $duration; ?></itunes:duration>
<itunes:summary>Épisode : <?php echo htmlspecialchars($title); ?></itunes:summary>
</item>
<?php } ?>
</channel>
</rss>