Files
redscapefactory.com/podcasts/fromfeed.sh
2026-01-14 23:56:45 +01:00

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É ---"