import os import json from datetime import datetime import argparse from utils.utils import get_blog_template_conf from website_config import configs_sites # Configuration des arguments de la ligne de commande parser = argparse.ArgumentParser(description="Générer un flux Atom des articles.") parser.add_argument("blog", help="Le nom du dossier de blog.") args = parser.parse_args() template_content = get_blog_template_conf(args.blog) website_ndd = template_content['NDD'] # Charger les données du fichier articles_info.json json_file = f'sources/{args.blog}/build/articles_info.json' with open(json_file, 'r', encoding='utf-8') as f: articles_info = json.load(f) # Trier les articles par date décroissante sorted_articles = sorted(articles_info.values(), key=lambda x: x['date'], reverse=True) # Vérifier s'il y a des articles avant de générer le flux if not sorted_articles: print("Aucun article trouvé. Le flux Atom ne sera pas généré.") exit(0) # Convert the date string to a valid ISO format def convert_to_iso(date_str): """ Convertit une chaîne de date en format ISO 8601. Gère les formats: - YYYYMMDDHHMMSS - YYYYMMDDTHHMMSS - YYYY-MM-DD Retourne: YYYY-MM-DDTHH:MM:SS """ try: # Nettoyer la chaîne d'entrée date_str = date_str.strip() # Supprimer tous les 'T' existants date_str = date_str.replace('T', '') # Si la date contient des tirets, la convertir au format attendu if '-' in date_str: try: parsed_date = datetime.strptime(date_str, '%Y-%m-%d') return parsed_date.strftime('%Y-%m-%dT00:00:00') except ValueError: print(f"Format de date invalide: {date_str}") return datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # S'assurer que la chaîne a la bonne longueur if len(date_str) < 14: date_str = date_str.ljust(14, '0') elif len(date_str) > 14: date_str = date_str[:14] # Extraire les composants de la date year = date_str[:4] month = date_str[4:6] day = date_str[6:8] hour = date_str[8:10] minute = date_str[10:12] second = date_str[12:14] # Vérifier que tous les composants sont des nombres components = [year, month, day, hour, minute, second] if not all(c.isdigit() for c in components): print(f"Date invalide détectée: {date_str}, utilisation de la date actuelle") return datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # Construire la chaîne ISO return f"{year}-{month}-{day}T{hour}:{minute}:{second}" except Exception as e: print(f"Erreur lors de la conversion de la date {date_str}: {e}") # En cas d'erreur, retourner la date actuelle return datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # Génération du flux Atom with open(f"html-websites/{args.blog}/feed/index.xml", "w", encoding="utf-8") as f: f.write('\n') f.write('\n') f.write(f' Flux Atom des articles de {args.blog}\n') f.write(f' \n') f.write(f' {datetime.fromisoformat(convert_to_iso(sorted_articles[0]["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}\n') f.write(' tag:' + website_ndd + ',2023:/feed\n') f.write(' \n') f.write(f' {configs_sites[args.blog]["AUTHOR"]}\n') f.write(f' {configs_sites[args.blog]["EMAIL"]}\n') f.write(' \n') f.write(f' \n') print(f"Génération du flux Atom pour {len(sorted_articles)} articles") # Boucle des articles for article in sorted_articles: f.write(' \n') f.write(f' tag:{website_ndd},2023:{article["slug_with_year"]}\n') f.write(f' {article["title"]}\n') f.write(f' \n') f.write(' \n') f.write(f' {article.get("extract", "")}\n') f.write(f' {datetime.fromisoformat(convert_to_iso(article["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}\n') f.write(f' {datetime.fromisoformat(convert_to_iso(article["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}\n') f.write(' \n') f.write(f' {configs_sites[args.blog]["AUTHOR"]}\n') f.write(f' {configs_sites[args.blog]["EMAIL"]}\n') f.write(' \n') f.write(' \n') f.write('')