- ordre inverse
- passage de parametres optionnels: nombres de jours et
-n
pour même ordre que le fil - constantes couleurs au format rvb et lien vers doc pour customisation plus facile
- python est objet donc pourquoi pas faire de l'objet (... même si aucunement nécessaire )
Code : Tout sélectionner
import os
import sys
import urllib.request
import html
from xml.etree import ElementTree as ET
import textwrap
import datetime
max_jours = 30 # limiter l'historique à ... on surcharge en parametre de notre script
#https://tforgione.fr/posts/ansi-escape-codes/
c_title = '\x1B[1m\x1b[38;2;80;130;255m' # format: 38;2;R;V;B
c_date = '\x1b[38;2;45;80;200m'
c_txt = '\x1B[3m\x1B[2m'
c_none = '\x1b[0m'
class DataNew:
def __init__(self, title: str, pubdate: str, text: str):
self.title = title
self.text = html.unescape(text)
self.pubdate = datetime.datetime.strptime(pubdate, '%a, %d %b %Y %H:%M:%S %z').date()
def __str__(self):
try:
cols, _ = os.get_terminal_size(0)
except OSError: # si utilise : "script.py &""
cols = 90
return \
f"{c_title}{self.title:<86}{c_none}\t" \
f"{c_date}{self.pubdate.strftime('%d/%m/%Y')} ({self.days} jours){c_none}" \
f"\n{c_txt}{textwrap.fill(self.text, cols-4, initial_indent=' ', subsequent_indent=' ')}{c_none}\n"
@property
def days(self):
delta = datetime.datetime.today().date() - self.pubdate
return delta.days
for arg in sys.argv[1:]:
try:
max_jours = int(arg)
except ValueError:
pass
try:
with urllib.request.urlopen('https://archlinux.fr/feed') as f_url:
datas = f_url.read()
except urllib.error.HTTPError:
exit(1)
root = ET.fromstring(datas)
news = []
for t in root.findall("channel/item"):
new = DataNew(
title=t.find('title').text,
pubdate=t.find('pubDate').text,
text=t.find('description').text
)
if new.days > max_jours:
break
news.append(new)
if "-n" not in sys.argv[1:]:
news.sort(key=lambda x: x.pubdate) # par défaut trier par date desc
for new in news:
print(new)
if len(news) > 1:
print(f"Voir détails: \x1B[4m{c_title}https://archlinux.fr/feed{c_none}")