CPC.PY

✅ Fait quoi ?

  • Récupère les métadonnées de chaque jeu de la collection softwarelibrary_cpc
  • Télécharge :
    • le ou les fichiers du jeu (.dsk, .zip, etc.)
    • la capture d’écran principale (screenshot, cover, etc.)
  • Enregistre tout dans un fichier CSV cpc_software_metadata.csv :
    • identifiant, titre, description, date, créateur, sujets, URL
    • chemins locaux des fichiers et de l’image

📁 Arborescence produite :


📂 cpc_games/ ← Fichiers .dsk, .zip…
📂 screenshots/ ← Captures d’écran (cover, title, etc.)
📄 cpc_software_metadata.csv ← CSV avec métadonnées + chemins locaux

durée du telechargement : 6H

cpc.py

import os
import csv
from internetarchive import search_items, get_item

collection = "softwarelibrary_cpc"
download_dir = "cpc_games"
screenshot_dir = "screenshots"
output_csv = "cpc_software_metadata.csv"

os.makedirs(download_dir, exist_ok=True)
os.makedirs(screenshot_dir, exist_ok=True)

fields = [
    "identifier", "title", "description", "date", "creator",
    "subject", "url", "local_files", "screenshot_file"
]

allowed_extensions = ['.dsk', '.zip', '.tap', '.tzx', '.img', '.bin']
image_extensions = ['.png', '.jpg', '.jpeg']

with open(output_csv, mode="w", newline="", encoding="utf-8") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fields)
    writer.writeheader()

    results = search_items(f'collection:{collection}')
    for result in results:
        identifier = result.get("identifier", "")
        print(f"📥 Traitement de : {identifier}")
        item = get_item(identifier)
        meta = item.metadata

        item_files = item.files
        filtered_files = [
            f["name"] for f in item_files
            if any(f["name"].endswith(ext) for ext in allowed_extensions)
        ]

        downloaded_paths = []
        if filtered_files:
            try:
                # Les fichiers seront dans un sous-dossier du nom de l'identifiant
                item.download(
                    destdir=download_dir,
                    files=filtered_files,
                    verbose=False
                )
                downloaded_paths = [
                    os.path.join(download_dir, identifier, f) for f in filtered_files
                ]
            except Exception as e:
                print(f"  ❌ Erreur téléchargement fichiers : {e}")
                continue

        screenshot_path = ""
        for file in item_files:
            name = file["name"].lower()
            if any(name.endswith(ext) for ext in image_extensions) and (
                "screenshot" in name or "title" in name or "cover" in name or "thumb" in name
            ):
                try:
                    # Téléchargement de l'image dans sous-dossier du jeu
                    item.get_file(file["name"]).download(
                        destdir=os.path.join(screenshot_dir, identifier),
                        verbose=False
                    )
                    screenshot_path = os.path.join(screenshot_dir, identifier, file["name"])
                    print(f"  🖼️ Screenshot téléchargée : {file['name']}")
                    break
                except Exception as e:
                    print(f"  ⚠️ Erreur screenshot : {e}")
                    break

        writer.writerow({
            "identifier": identifier,
            "title": meta.get("title", ""),
            "description": meta.get("description", ""),
            "date": meta.get("date", ""),
            "creator": meta.get("creator", ""),
            "subject": "; ".join(meta.get("subject", [])) if isinstance(meta.get("subject"), list) else meta.get("subject", ""),
            "url": f"https://archive.org/details/{identifier}",
            "local_files": "; ".join(downloaded_paths),
            "screenshot_file": screenshot_path
        })

print(f"\n✅ Terminé. Jeux dans '{download_dir}', captures dans '{screenshot_dir}', CSV : '{output_csv}'")


Arnold

statiquedynamique