115 lines
3.8 KiB
Bash
115 lines
3.8 KiB
Bash
#!/bin/bash
|
|
|
|
# --- CONFIGURATION À ADAPTER ---
|
|
# Exemple pour le Deep Sea Project
|
|
PODCAST_NAME="deepseaproject"
|
|
RSS_URL="$PODCAST_NAME/rss"
|
|
# Le dossier racine de ton site (à adapter si besoin)
|
|
BASE_DIR="$PODCAST_NAME"
|
|
# Le dossier spécifique du podcast
|
|
WORKING_DIR="podcasts/$PODCAST_NAME"
|
|
|
|
## DOSSIERS INTERNES
|
|
IMAGE_DIR="$WORKING_DIR/images"
|
|
EPISODE_DIR="$WORKING_DIR/episodes"
|
|
ENCLOSURE_DIR="$WORKING_DIR/enclosure"
|
|
EPISODE_JSON="$WORKING_DIR/episodes.json"
|
|
|
|
# Chemins relatifs pour le HTML (on est dans podcasts/nom/episodes/)
|
|
# On doit remonter de 3 niveaux pour la racine : ../../../
|
|
REL_PATH="../../../"
|
|
|
|
mkdir -p "$IMAGE_DIR" "$EPISODE_DIR" "$ENCLOSURE_DIR"
|
|
|
|
# Nettoyage JSON compatible Mac
|
|
clean_json_text() {
|
|
echo "$1" | sed 's/<!\[CDATA\[//g; s/\]\]>//g; s/\\/\\\\/g; s/"/\\"/g' | tr -d '\n' | tr -d '\r'
|
|
}
|
|
|
|
# Téléchargement du flux RSS en local pour le traitement
|
|
curl -L -s -o "temp_rss.xml" "$RSS_URL"
|
|
|
|
echo "--- DÉBUT DU TRAITEMENT : $PODCAST_NAME ---"
|
|
|
|
# 1. Découpage des items sans csplit (via AWK)
|
|
awk '/<item>/{n++}{print > "item_" n ".xml"}' temp_rss.xml
|
|
|
|
echo "[" > "$EPISODE_JSON"
|
|
FIRST_ITEM=true
|
|
|
|
for f in item_*.xml; do
|
|
# On saute le premier fichier s'il ne contient pas d'item (en-tête du flux)
|
|
if ! grep -q "<item>" "$f"; then rm "$f"; continue; fi
|
|
|
|
# Extraction des données
|
|
TITLE=$(grep "<title>" "$f" | sed 's/.*<title><!\[CDATA\[\(.*\)\]\]><\/title>.*/\1/')
|
|
PUBDATE=$(grep "<pubDate>" "$f" | sed 's/.*<pubDate>\(.*\)<\/pubDate>.*/\1/' | cut -d',' -f2 | cut -d':' -f1,2)
|
|
REMOTE_AUDIO=$(grep "<enclosure" "$f" | sed 's/.*url="\([^"]*\)".*/\1/')
|
|
REMOTE_COVER=$(grep "itunes:image" "$f" | sed 's/.*href="\([^"]*\)".*/\1/')
|
|
|
|
# ID / Slug
|
|
ID=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed "s/[^a-z0-9]/-/g; s/--*/-/g; s/^-//; s/-$//")
|
|
|
|
echo " > Episode : $ID"
|
|
|
|
# Téléchargement AUDIO (Ajout de -L pour les redirections et -k au cas où)
|
|
curl -Lk -s -o "$ENCLOSURE_DIR/$ID.mp3" "$REMOTE_AUDIO"
|
|
# Téléchargement IMAGE
|
|
curl -Lk -s -o "$IMAGE_DIR/$ID.jpg" "$REMOTE_COVER"
|
|
|
|
# Description
|
|
DESC_HTML=$(sed -n '/<description>/,/<\/description>/p' "$f" | sed -e 's/<description>//g' -e 's/<\/description>//g' -e 's/<!\[CDATA\[//g' -e 's/\]\]>//g')
|
|
|
|
# --- GÉNÉRATION HTML ---
|
|
cat <<EOF > "$EPISODE_DIR/$ID.html"
|
|
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>$TITLE | REDSCAPEFACTORY</title>
|
|
<link rel="stylesheet" href="${REL_PATH}style.css">
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<nav>
|
|
<div class="logo"><a href="${REL_PATH}index.html"><img src="${REL_PATH}assets/img/logo.png"></a></div>
|
|
<ul class="nav-links">
|
|
<li><a href="${REL_PATH}index.html">Home</a></li>
|
|
<li><a href="${REL_PATH}podcasts.html">Podcasts</a></li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
<main class="project-container">
|
|
<section class="project-info">
|
|
<div class="brand-line"><span>$PODCAST_NAME</span> • $PUBDATE</div>
|
|
<h1>$TITLE</h1>
|
|
<div class="audio-player-box">
|
|
<audio controls><source src="../enclosure/$ID.mp3" type="audio/mpeg"></audio>
|
|
</div>
|
|
<div class="description">$DESC_HTML</div>
|
|
<a href="${REL_PATH}podcasts.html" class="back-link">← RETOUR</a>
|
|
</section>
|
|
<section class="project-visual"><img src="../images/$ID.jpg"></section>
|
|
</main>
|
|
</body>
|
|
</html>
|
|
EOF
|
|
|
|
# JSON
|
|
if [ "$FIRST_ITEM" = false ]; then echo "," >> "$EPISODE_JSON"; fi
|
|
cat <<EOF >> "$EPISODE_JSON"
|
|
{
|
|
"id": "$ID",
|
|
"title": "$(clean_json_text "$TITLE")",
|
|
"audio": "enclosure/$ID.mp3",
|
|
"cover": "images/$ID.jpg",
|
|
"file": "episodes/$ID.html"
|
|
}
|
|
EOF
|
|
FIRST_ITEM=false
|
|
rm "$f"
|
|
done
|
|
|
|
echo "]" >> "$EPISODE_JSON"
|
|
rm temp_rss.xml
|
|
echo "--- TERMINÉ ---" |