from datetime import date | from datetime import date | ||||
from pathlib import Path | from pathlib import Path | ||||
from time import perf_counter | from time import perf_counter | ||||
from urllib.parse import urlparse | |||||
import httpx | import httpx | ||||
import lassie | import lassie | ||||
def fetch_metadata(title, url, description): | def fetch_metadata(title, url, description): | ||||
"""Fetch additional metadata.""" | """Fetch additional metadata.""" | ||||
parsed_url = urlparse(url) | |||||
root_url = f"{parsed_url.scheme}://{parsed_url.netloc}/" | |||||
data = lassie.fetch(url) | data = lassie.fetch(url) | ||||
og_image = "" | og_image = "" | ||||
favicon = "" | favicon = "" | ||||
for image in data.get("images"): | for image in data.get("images"): | ||||
image_type = image.get("type") | image_type = image.get("type") | ||||
if image_type == "og:image" and not og_image: | |||||
og_image = image["src"] | |||||
image_src = image.get("src") | |||||
if image_src == root_url: | |||||
og_image = "" | |||||
continue | |||||
elif image_type == "og:image" and not og_image: | |||||
og_image = image_src | |||||
continue | continue | ||||
elif image_type == "twitter:image" and not og_image: | elif image_type == "twitter:image" and not og_image: | ||||
og_image = image["src"] | |||||
og_image = image_src | |||||
continue | continue | ||||
elif image_type == "favicon": | elif image_type == "favicon": | ||||
image_src = image["src"] | |||||
if not favicon: | if not favicon: | ||||
favicon = image_src | favicon = image_src | ||||
elif ".ico" in favicon and ".ico" not in image_src: | elif ".ico" in favicon and ".ico" not in image_src: | ||||
favicon = image_src | favicon = image_src | ||||
# Fallback on server's default. | |||||
if not favicon: | |||||
favico_url = f"{root_url}favicon.ico" | |||||
response = httpx.get(favico_url) | |||||
if response.status_code == 200: | |||||
favicon = favico_url | |||||
if data.get("title") != title: | if data.get("title") != title: | ||||
print(data.get("title"), "vs.", title, url) | print(data.get("title"), "vs.", title, url) | ||||
description = description or data.get("description", "") | description = description or data.get("description", "") | ||||
if cache.url.startswith("https://tw5.immateriel.fr"): | if cache.url.startswith("https://tw5.immateriel.fr"): | ||||
print("Skipping", cache.url) | print("Skipping", cache.url) | ||||
continue | continue | ||||
if cache.favicon and ( | |||||
cache.description | |||||
or cache.url.startswith( | |||||
( | |||||
"https://www.la-grange.net", | |||||
"https://gilest.org", | |||||
"https://vasilis.nl", | |||||
"https://www.danmcquillan.org", | |||||
"https://public-inbox.org", | |||||
) | |||||
) | |||||
): | |||||
print("Skipping", cache.url) | |||||
continue | |||||
# if cache.description or cache.url.startswith( | |||||
# ( | |||||
# "https://www.la-grange.net", | |||||
# "https://gilest.org", | |||||
# "https://vasilis.nl", | |||||
# "https://www.danmcquillan.org", | |||||
# "https://public-inbox.org", | |||||
# ) | |||||
# ): | |||||
# print("Skipping", cache.url) | |||||
# continue | |||||
print("Fetching metadata for", cache.url, cache.title) | print("Fetching metadata for", cache.url, cache.title) | ||||
og_image, description, favicon = fetch_metadata( | og_image, description, favicon = fetch_metadata( | ||||
cache.title, cache.url, cache.description | cache.title, cache.url, cache.description |
archive_date: 2024-01-28 | archive_date: 2024-01-28 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/23/3152-ciel.jpg" alt="Ciel nuageux au dessus de maisons. On ne voit que le premier étage des maisons."> | <img src="https://www.la-grange.net/2024/01/23/3152-ciel.jpg" alt="Ciel nuageux au dessus de maisons. On ne voit que le premier étage des maisons."> |
url: https://www.quaternum.net/2024/01/08/tools-shape-practices-shape-tools/ | url: https://www.quaternum.net/2024/01/08/tools-shape-practices-shape-tools/ | ||||
hash_url: 34fec23081019abd741e0578b050c40e | hash_url: 34fec23081019abd741e0578b050c40e | ||||
archive_date: 2024-01-11 | archive_date: 2024-01-11 | ||||
og_image: https://www.quaternum.net/ | |||||
og_image: | |||||
description: Je découvre (très) tardivement ce _mantra_, ou plutôt ce positionnement récursif et infini : les pratiques modèlent les outils qui modèlent les pratiques etc. | description: Je découvre (très) tardivement ce _mantra_, ou plutôt ce positionnement récursif et infini : les pratiques modèlent les outils qui modèlent les pratiques etc. | ||||
favicon: | favicon: | ||||
url: https://www.quaternum.net/2023/06/02/fabrique-concept/ | url: https://www.quaternum.net/2023/06/02/fabrique-concept/ | ||||
hash_url: 55477786fc56b6fc37bb97231b634d90 | hash_url: 55477786fc56b6fc37bb97231b634d90 | ||||
archive_date: 2024-01-07 | archive_date: 2024-01-07 | ||||
og_image: https://www.quaternum.net/ | |||||
og_image: | |||||
description: Le terme fabrique définit une approche spécifique dans la création et dans la production d’artefact, y compris dans le domaine de l’édition. | description: Le terme fabrique définit une approche spécifique dans la création et dans la production d’artefact, y compris dans le domaine de l’édition. | ||||
favicon: | favicon: | ||||
archive_date: 2024-01-28 | archive_date: 2024-01-28 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/20/3134-carnets.jpg" alt="Carnets de notes en archéologie écrit en japonais avec des dessins."> | <img src="https://www.la-grange.net/2024/01/20/3134-carnets.jpg" alt="Carnets de notes en archéologie écrit en japonais avec des dessins."> |
archive_date: 2024-01-11 | archive_date: 2024-01-11 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/09/3045-glace.jpg" alt="Cubes de glace étalés sur la chaussée à côté de boîte en plastique et d'un poteau rouge. La glace a un peu fondu."> | <img src="https://www.la-grange.net/2024/01/09/3045-glace.jpg" alt="Cubes de glace étalés sur la chaussée à côté de boîte en plastique et d'un poteau rouge. La glace a un peu fondu."> |
archive_date: 2024-01-28 | archive_date: 2024-01-28 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/24/3154-herbe.jpg" alt="Couverte du livre la fraîcheur de l'herbe avec une illustration de graminées."> | <img src="https://www.la-grange.net/2024/01/24/3154-herbe.jpg" alt="Couverte du livre la fraîcheur de l'herbe avec une illustration de graminées."> |
archive_date: 2024-01-07 | archive_date: 2024-01-07 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2023/07/10/0797-batiment-visage.jpg" alt="bâtiments avec deux signes blancs. L'ensemble donne un peu l'impression d'un visage."> | <img src="https://www.la-grange.net/2023/07/10/0797-batiment-visage.jpg" alt="bâtiments avec deux signes blancs. L'ensemble donne un peu l'impression d'un visage."> |
archive_date: 2024-01-28 | archive_date: 2024-01-28 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/26/3159-chauffage.jpg" alt="Détail de la lampe à chauffer."> | <img src="https://www.la-grange.net/2024/01/26/3159-chauffage.jpg" alt="Détail de la lampe à chauffer."> |
archive_date: 2024-01-07 | archive_date: 2024-01-07 | ||||
og_image: | og_image: | ||||
description: | description: | ||||
favicon: | |||||
favicon: https://www.la-grange.net/favicon.ico | |||||
<figure> | <figure> | ||||
<img src="https://www.la-grange.net/2024/01/06/3008-furikake.jpg" alt="Feuilles de céleri et de persil, finement hâchées avec du zeste de citron."> | <img src="https://www.la-grange.net/2024/01/06/3008-furikake.jpg" alt="Feuilles de céleri et de persil, finement hâchées avec du zeste de citron."> |