Skip to main content

CLI-Tool zur Erstellung von Mediensets (statisches HTML mit OG-Tags, Vorschaubildern und ZIP-Download) aus Videodateien.

Project description

mediaset-creator

CLI-Tool und Python-Bibliothek zur Erstellung von Mediensets aus Videodateien. Ein Medienset ist ein ULID-basiertes Verzeichnis mit statischem HTML, Vorschaubildern, ZIP-Download und der Videodatei – bereit zum Hochladen auf einen Webserver.


Voraussetzungen


Installation

uv pip install kurmann-mediaset-creator

Im Entwicklungsmodus (editierbar):

uv sync

Verwendung (CLI)

Einzelnes Video

mediaset-creator create /pfad/zu/video.m4v \
  --title "Familienfilme 2024" \
  --video-title "Leah Treppen-Surfen" \
  --video-description "Leah demonstriert ihre hohe Kunst des Treppen-Surfens." \
  --video-category "Familie Kurmann-Glück" \
  --video-date "2024-07-01" \
  --video-quality "Dolby Vision"

Das Medienset wird im Verzeichnis der Quelldatei unter einem ULID-Unterverzeichnis erstellt. Ein anderes Ausgabeverzeichnis kann mit --output-dir angegeben werden:

mediaset-creator create /pfad/zu/video.m4v \
  --output-dir /tmp/mediasets \
  --video-title "Mein Film"

Mehrere Videos (JSON)

Für Mediensets mit mehreren Videos wird eine JSON-Datei mit Metadaten übergeben:

mediaset-creator create --from-json metadaten.json

Format der JSON-Datei:

{
  "title": "Familienfilme 2024",
  "videos": [
    {
      "path": "/pfad/zu/video1.m4v",
      "title": "Leah Treppen-Surfen",
      "description": "Beschreibung des Videos.",
      "category": "Familie Kurmann-Glück",
      "recording_date": "2024-07-01",
      "quality_label": "Dolby Vision"
    },
    {
      "path": "/pfad/zu/video2.m4v",
      "title": "Herbst-Spaziergang",
      "description": "Ein sonniger Herbsttag.",
      "recording_date": "2024-11-01",
      "quality_label": "4K HDR"
    }
  ]
}

Optionen

Option Beschreibung
--title TEXT Übergeordneter Mediaset-Titel (h1). Bei Einzelvideo auch als Video-Titel verwendet, wenn --video-title fehlt. Fallback: Dateiname.
--video-title TEXT Titel des Videos (nur bei Multi-Video nötig; bei Einzelvideo wird --title übernommen)
--video-description TEXT Beschreibung des Videos
--video-category TEXT Kategorie (z.B. «Familie Kurmann-Glück»)
--video-date TEXT Aufnahmedatum im ISO-Format (YYYY-MM-DD). Wird als Dateiname-Prefix und in der Anzeige als deutsches Long-Datum verwendet.
--video-quality TEXT Qualitätsangabe (z.B. «Dolby Vision», «4K HDR»)
--output-dir PATH Basisverzeichnis für die Ausgabe (Default: Verzeichnis der Quelldatei)
--from-json PATH JSON-Datei mit Metadaten für Multi-Video-Mediaset
--no-og-tags OpenGraph-Tags deaktivieren
--verbose, -v Zusätzliche Ablaufinformationen auf stderr ausgeben

Ausgabe

stdout enthält den Pfad zum erstellten ULID-Verzeichnis:

/pfad/zum/output/01JNXYZ.../

Statusmeldungen werden auf stderr ausgegeben (nur mit --verbose).

Erzeugte Verzeichnisstruktur

<ULID>/
├── index.html              # HTML-Seite mit Vorschaubild und Video-Link
├── video.m4v               # Kopie der Videodatei
├── video-landscape.jpg     # Landscape-Vorschaubild (16:9, 1920×1080)
├── video-poster.jpg        # Portrait-Vorschaubild (2:3, 1080×1620)
└── video.zip               # ZIP mit Video + beiden Vorschaubildern

Konfiguration

Einstellungen werden in ~/.config/mediaset-creator/config.toml gespeichert.

Befehle

# Wert speichern
mediaset-creator config set <schlüssel> "<wert>"

# Einzelnen Wert lesen
mediaset-creator config get <schlüssel>

# Alle gespeicherten Werte anzeigen
mediaset-creator config list

Erlaubte Schlüssel

Schlüssel Beschreibung Standard
og.base_url Stamm-URL für OG-Tags (z.B. https://example.com/shares/) (leer)
og.enabled OG-Tags aktivieren (true/false) true
og.site_name OG site_name Metadatum (leer)
og.locale OG locale Metadatum de_CH
thumbnails.sidecar Sidecar-Bilder als Landscape-Quelle verwenden (true/false) true
title.filename_fallback Dateiname (ohne Erweiterung) als Titel-Fallback verwenden (true/false) true
filename.date_prefix Datum (YYYY-MM-DD) als Dateiname-Prefix verwenden (true/false) true
tools.ffmpeg Pfad zur ffmpeg-Binärdatei ffmpeg
tools.ffprobe Pfad zur ffprobe-Binärdatei ffprobe

Beispiel config.toml

[og]
base_url = "https://kurmannmedia.blob.core.windows.net/kurmann-glueck/"
enabled = "true"
site_name = "Patrick Kurmann Familienfilm-Freigabe"
locale = "de_CH"

[thumbnails]
sidecar = "true"

[title]
filename_fallback = "true"

[filename]
date_prefix = "true"

[tools]
ffmpeg = "ffmpeg"
ffprobe = "ffprobe"

OG-Tags

Wenn og.base_url gesetzt ist und OG-Tags aktiviert sind, generiert das HTML OpenGraph-Metadaten für ansprechende Link-Vorschauen in Messengern und sozialen Netzwerken. Die vollständige URL wird aus base_url + ULID/ zusammengesetzt.

OG-Tags lassen sich deaktivieren via:

  • mediaset-creator config set og.enabled false (persistent)
  • mediaset-creator create --no-og-tags ... (pro Aufruf)

Verwendung (Python API)

Die öffentliche API kann von anderen Python-Anwendungen genutzt werden:

from pathlib import Path
from mediaset_creator.api import (
    CreateMediasetRequest,
    MediaItem,
    RuntimeOptions,
    create_mediaset,
)

# Fachlicher Request
request = CreateMediasetRequest(
    items=[
        MediaItem(
            source_path=Path("/pfad/zu/video.m4v"),
            title="Leah Treppen-Surfen",
            description="Beschreibung des Videos.",
            category="Familie Kurmann-Glück",
            recording_date="1. Juli 2024",
            quality_label="Dolby Vision",
        ),
    ],
    mediaset_title="Familienfilme 2024",
    output_dir=Path("/tmp/mediasets"),
    enable_og_tags=True,
)

# Technische Laufzeitoptionen (getrennt vom fachlichen Request)
runtime = RuntimeOptions(
    base_url="https://example.com/shares/",
    ffmpeg_path="ffmpeg",
    ffprobe_path="ffprobe",
)

# Mediaset erstellen
result = create_mediaset(request, runtime)

if result.success:
    print(f"Mediaset erstellt: {result.output_dir}")
    print(f"HTML: {result.html_path}")
else:
    print(f"Fehler: {result.error_message}")

Fortschritts-Events

Für lang laufende Operationen kann ein Event-Callback übergeben werden:

from mediaset_creator.api import MediasetCreatorEvent

def on_event(event: MediasetCreatorEvent) -> None:
    label = f" [{event.current}/{event.total}]" if event.current is not None else ""
    print(f"  {event.message}{label}")

result = create_mediaset(request, runtime, on_event=on_event)

Öffentliche API-Exporte

from mediaset_creator.api import (
    create_mediaset,          # Hauptfunktion
    CreateMediasetRequest,    # Fachlicher Request
    MediaItem,                # Ein Medienelement (aktuell: Video)
    RuntimeOptions,           # Technische Laufzeitoptionen
    MediasetResult,           # Ergebnis mit Pfaden
    MediasetCreatorEvent,     # Strukturiertes Fortschritts-Event
    MediasetCreatorStage,     # Stage-IDs (StrEnum)
)

Änderungsverlauf

1.0.0 – 2026-03-26

  • Erstveröffentlichung als Python CLI-Applikation
  • create-Befehl für Einzel- und Multi-Video-Mediensets
  • config-Befehle für persistente TOML-Konfiguration
  • Öffentliche Python API mit Request/Result-Muster
  • Vorschaubilder via vorschaubild-manager (Landscape + Portrait)
  • Poster-Overlay: Titel, Kategorie und Datum werden ins Portrait-Bild eingebettet
  • Sidecar-Bilder als Landscape-Quelle (konfigurierbar via thumbnails.sidecar)
  • Titel-Fallback: Dateiname wird als Titel verwendet wenn keiner angegeben (konfigurierbar via title.filename_fallback)
  • Datum-Prefix: Dateinamen erhalten YYYY-MM-DD als Prefix wenn --video-date angegeben (konfigurierbar via filename.date_prefix)
  • Datum-Eingabe im ISO-Format (YYYY-MM-DD), automatische Anzeige als deutsches Long-Datum (z.B. «Sonntag, 22. März 2026»)
  • Einzelvideo: --title wird automatisch als Video-Titel übernommen; h2-Untertitel wird nur bei Multi-Video angezeigt
  • ZIP-Download mit Video und Vorschaubildern (unkomprimiert, da Video bereits komprimiert)
  • ULID-basierte Ausgabeverzeichnisse
  • OG-Tags konfigurierbar und abschaltbar
  • Eigenständiges CSS (kein CDN, kein JavaScript)
  • Dark-Theme, responsive Layout

Vollständige Historie: CHANGELOG.md


Lizenz

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kurmann_mediaset_creator-1.0.0.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kurmann_mediaset_creator-1.0.0-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

File details

Details for the file kurmann_mediaset_creator-1.0.0.tar.gz.

File metadata

  • Download URL: kurmann_mediaset_creator-1.0.0.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for kurmann_mediaset_creator-1.0.0.tar.gz
Algorithm Hash digest
SHA256 27a103dde058f3c1ae6f7eec555f21a80511d00528042340e2507ec094dc4922
MD5 c26e7012ce054e14a0e1bdbeca81ba9e
BLAKE2b-256 0dd0ccc6ae4abfef228973fadd5da05a2e97dd349d801a81188efa2eb9c34437

See more details on using hashes here.

Provenance

The following attestation bundles were made for kurmann_mediaset_creator-1.0.0.tar.gz:

Publisher: publish.yml on kurmann/mediaset-creator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kurmann_mediaset_creator-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for kurmann_mediaset_creator-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 eb3fb7b3d32bea861d2672093ae7c093689463362bb5d21db3e81aaf6d9d5892
MD5 121ea53e842e2788e240586d48c70a77
BLAKE2b-256 99638bfb097eb5230c32bb4f27850860dcfbb0c97fd7d23aa3dae5e2503fb0f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for kurmann_mediaset_creator-1.0.0-py3-none-any.whl:

Publisher: publish.yml on kurmann/mediaset-creator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page