Transportverfahren | Übertragung per Restful API (https) |
---|---|
Objekt | Artikel im JSON und Bilder als strukturiertes Objekt im JSON, Artikel-ID als eindeutiges Merkmal (document ID) |
Trigger | Zeitlich gesteuerter Poll durch PRINT NGEN (Pull alle 15 Sekunden, sofern vorhergehender Pull durchgeführt), Artikel-ID = eindeutiges Merkmal |
Typische Drittsysteme | Livingdocs |
...
Das Gleiche gilt auch, wenn die Ausgabe in Livingdocs geändert wird. D. h. wird ein Livingdocs-Artikel mit der Ausgabe A publiziert, anschließend die Ausgabe in Livingdocs zur Ausgabe B geändert und erneut publiziert, bleibt der Artikel in PRINT NGEN zur Ausgabe A wie bisher bestehen. Beim zweiten Publizieren wird in PRINT NGEN ein Artikel zur Ausgabe B erstellt.
Enthält ein Livingdocs-Artikel Bilder, dann werden diese nach PRINT NGEN importiert und an den Artikel gehängt. Für den Import der Bilder wird der Pfad “originalUrl” aus dem Artikel-JSON verwendet. Wenn das Bild aus “originalUrl” nicht gefunden wird, wird das Bild aus “url” abgeholt.
Das Erstellen und Publizieren eines Livingdocs-Artikels ist in nachfolgenden Videos beispielhaft skizziert (die gezeigten Metadaten beschränken sich im Video überwiegend auf die Pflichtfelder):
...
Die DocumentIDs, die PRINT NGEN bei der Abfrage der Events erhalten hat, werden verwendet, um die Artikel-JSON abzufragen, z. B.:
GET v1/print/document?documentId=44
Das JSON, das an Beim Import nach PRINT NGEN zurück geliefert wird, enthält folgende wird das JSON in ein XML umgewandelt. Danach läuft ein XSLT-Stylesheet, das die übergebenen Inhalte in die entsprechenden Bereiche und Tags umwandelt.
Das JSON, das an PRINT NGEN zurück geliefert wird, enthält folgende Felder:
Metadaten:
Feld | Inhalt | Option |
"projectId" | ID des Projektes | - |
"channelId" | ID des Kanals | - |
"documentId" | ID des Artikels | erforderlich |
"contentType" | “print” bei Printartikeln | - |
"documentType" | “article” bei Artikeln | - |
"design": { "name" } | Name des Designs | - |
"design": { "version" } | Versionsnummer des Designs | - |
"metadata": { "title" } | Titel (siehe “Titel des Artikels” unten) | optional |
"metadata": { "publish-date" oder: "publicationDate" } | Erscheinungstag im Format “2020-03-31”. Ein Erscheinungstag für alle übertragenen Ausgaben. | erforderlich, wenn der ET für alle Ausgaben gelten soll |
"metadata": { "publications" oder: "publication": [{ "date" }] | Erscheinungstag im Format “2020-03-31”. Ein unterschiedlicher Erscheinungstag je übertragener Ausgabe (Alternative zu einem Erscheinungstag für alle übertragenen Ausgaben) | erforderlich, wenn je Ausgabe ein unterschiedlicher ET gelten soll |
"metadata": { "publications" oder: "publication": [{ "object" }] | Objekt der Publikation | optional |
"metadata": { "publications" oder: "publication": [{ "name" }] | Name der Publikation | - |
"metadata": { "publications" oder: "publication": [{ "value" }] | Ausgabe der Publikation | erforderlich |
"metadata": { "publications" oder: "publication": [{ "category" }] | Ressort der Publikation | erforderlich |
"metadata": { "publications" oder: "publication": [{ "pageIndex" }] | Ressortindex der Publikation | optional |
"metadata": { "publications" oder: "publication": [{ "printContentType" }] | Formatname (z. B. Aufmacher, Standard) (Infoboxen erhalten immer den Formatnamen “Infobox”) | optional |
"metadata": { "publications" oder: "publication": [{"collective"}] | Kollektiv/Sonderthema der Publikation (Achtung: Der Wert darf nicht die Sonderzeichen *?<>&,%"'! enthalten!) | optional |
"metadata": { "print- categories-xxx" } | Print-Kategorie | - |
"metadata": { "expire-date" } | Endzeitpunkt im Format 2020-04-02T14:10:00.000Z | - |
...
Feld | Inhalt | Option |
"id" | ID des Elements im Artikel | - |
"component" | Element des Artikels, z. B.:
| - |
"content": { component: "image", “content”: { “image”: { "originalUrl" }}} | URL des Original-Bildes. Wird standardmäßig zum Abholen des Bildes verwendet. | erforderlich |
"content": { component: "image", “content”: { “image”: { "url" }}} | URL des platzierten Bildes. Wenn das Bild aus “originalUrl” nicht gefunden wird, wird das Bild aus “url” abgeholt. | optional |
"content": { component: "image", “content”: { “image”: { "origins": { "name" }}}} | Ursprung/Quelle des Bildes z. B. hugo. Wird kein Ursprung übergeben wird standardmäßig BildUrsprung=Livingdocs gesetzt. | optional |
"content": { component: "image", “content”: { “image”: { "origins": { "identifier" }}}} | Bild-ID Wird in die NGEN Bildeigenschaft DBildArchivID übernommen. |
|
"content": { component: "image", “content”: { “image”: { "crop": { "x" }}}} | X-Koordinate des Ausschnitts von links oben | - |
"content": { component: "image", “content”: { “image”: { "crop": { "y" }}}} | Y-Koordinate des Ausschnitts von links oben | - |
"content": { component: "image", “content”: { “image”: { "crop": { "width" }}}} | Breite des Ausschnitts in Pixel relativ zur Pixelgröße des Originalbildes aus der originalUrl | optional |
"content": { component: "image", “content”: { “image”: { "crop": { "height" }}}} | Höhe des Ausschnitts in Pixel relativ zur Pixelgröße des Originalbildes aus der originalUrl | optional |
"content": { component: "image", “content”: { "caption" }} | Bildunterschrift | optional |
"content": { component: "image", “content”: { "source" }} | Bildquelle "labelSource" "source" werden in das Bildquelle-Tag der BU übernommen (in dieser Reihenfolge mit Leerzeichen getrennt) | optional |
"content": { component: "image", “content”: { "labelSource" }} | Quellverweis "labelSource" "source" werden in das Bildquelle-Tag der BU übernommen (in dieser Reihenfolge mit Leerzeichen getrennt) | optional |
"content": { component: "head" oder: "header", content: { "catchline" }} | Dachzeile des Artikels | optional |
"content": { component: "head" oder: "header", content: { "title" }} | Titel des Artikels | erforderlich |
"content": { component: "head" oder: "header", content: { "lead" }} | Unterzeile des Artikels | optional |
"content": { component: "head" oder: "header", content: { "author" }} | Autor:in des Artikels | optional |
"content": { component: "head" oder: "header", content: { "authorShortnames" }} | Autor:innenkürzel | optional |
"content": { component: "head" oder: "header", content: { "city" }} | Ort des Artikels | optional |
"content": { component: "lead-p", content: { "text" }} | Vorspann des Artikels | optional |
"position" | z. B. fixed | - |
"content": { component: "p", content: { "text" }} | Absatz eines Artikels | optional |
"content": { component: “subtitle”, “content“: { “title“ }} | Zwischentitel im Artikel | optional |
"content": { component: “list”, “containers”: { “list” }} | Liste im Artikel | optional |
"content": { component: “list” , “containers”: { “list”: [{ “component”: “list-item”, “content”: { “text” }}]}} | Listenelement | optional |
"content": { component: “quote” , “content”: { “text” }} | Zitat im Artikel | optional |
"content": { component: “quote” , “content”: { “source” }} | Autor:in/Quelle des Zitats | optional |
"content": { component: "question" , "content": { "text" }} | Frage | optional |
"content": { component: "answer" , "content": { "text" }} | Antwort | optional |
"content": {"component": "infobox","content": { "title": "", "text": "", "image": {} "caption": "", "source": "" }} | Infobox im Artikel (in PRINT NGEN als eigenständiger Artikel) mit oder ohne Bild. Im Text sind Auszeichnungen (strong, em, p) möglich. Weitere Components (list, quote, question, answer) dürfen im Text nicht übergeben werden. Für Infoboxbilder können die gleichen Felder übergeben werden wie bei den Artikelbildern. | optional |
...
Code Block |
---|
{ "systemdata": { "projectId": 16, "channelId": 16, "documentId": 44, "contentType": "print", "documentType": "article", "design": { "name": "berliner-zeitung", "version": "0.0.100" } }, "metadata": { "title": "Title", "publications": [{ "object": "BZ", "name": "Berliner Zeitung", "value": "Berliner Zeitung", "category": "Berlin", "printContentType": "Standard", "pageIndex": "1" }, { "object": "BK", "name": "Berliner Kurier", "value": "Berliner Kurier", "category": "Berlin", "printContentType": "Aufmacher", "pageIndex": "3", "collective": "Sonderthema XYZ" } ], "publish-date": "2020-03-17T10:35:00.000Z", "expire-date": "2020-04-30T09:35:00.000Z" }, "livingdoc": { "content": { "id": "doc-1e3k0qt0h0", "component": "head", "content": { "catchline": "Catchline", "title": "Title", "lead": "Lead", "author": "Lukas Peyer", "authorShortnames": "LP" }, "position": "fixed" }, { "id": "doc-1e3k0qt0i0", "component": "lead-p", "content": { "opener": "Lead Paragraph", "text": "Text" } }, { "id": "doc-1e3k0qt0i1", "component": "p", "content": { "text": "Text" } }, { "id": "doc-1e3k0ts9b0", "component": "image", "content": { "image": { "originalUrl": "http://livingdocs-images-dev.s3.amazonaws.com/2020/1/28/6c0b3ce3-0289-44da-9610-91f1d9773419.jpeg", "url": "https://livingdocs-dev.imgix.net/2020/1/28/6c0b3ce3-0289-44da-9610-91f1d9773419.jpeg?rect=0%2C20%2C1200%2C675&auto=format", "width": 1200, "height": 714, "mimeType": "image/jpeg", "imageService": "imgix", "crop": { "x": 0, "y": 20, "width": 1200, "height": 675, "name": "16:9" } "origins": [ { "name": "archiv A", "identifier": "abc-123" }] }, "caption": "Image Caption", "labelSource": "Source", "source": "Agency" } }, { "id": "doc-1e3k0sng70", "component": "quote", "content": { "text": "Quote", "source": "Quote Author" } }, { "component": "question", "id": "doc-1e3k0sng70", "content": { "text": "Frage Inhalt." } }, { "component": "answer", "id": "doc-1e3k0sng70", "content": { "text": "Antwort Inhalt." } }, { "id": "doc-1e3k0sveu0", "component": "subtitle", "content": { "title": "Subtitle" } }, { "id": "doc-1e3k0s91s0", "component": "list", "content": { "title": "List Title" }, "containers": { "list": [ { "id": "doc-1e3k0sacb0", "component": "list-item", "content": { "text": "Item 1" } }, { "id": "doc-1e3k0sgrn0", "component": "list-item", "content": { "text": "Item 2" } } ] } } ], "design": { "name": "berliner-zeitung", "version": "0.0.100" }, "layout": "print" } } |
Auch die im Artikel-JSON angegebenen Bilder werden nach PRINT NGEN importiert. Hierfür wird der Pfad “originalURL” verwendet.
...
Fehlerbehandlung
HTTP-Fehler
Wird ein HTTP-Fehler “404 (NOT FOUND)” zurück geliefertNOT FOUND” zurückgeliefert, wird dieser Artikel übersprungen.
Wird ein anderer HTTP-Fehler (z.B. “500 Internal Server Error“) zurückgeliefert, versucht PRINT NGEN erneut, den Artikel abzurufen, bis er importiert werden kann. Diese Fehlercodes sollten nämlich nur kommen, wenn der Service kurzfristig nicht erreichbar ist (z.B. Neustart/Wartung). Daher werden diese Artikel nicht übersprungen, sondern dann importiert, wenn der Server wieder erreichbar ist.
Inhaltliche Fehler
Bei inhaltlichen/syntaktischen Fehlern im Artikel-JSON, ist das XML nicht gültig und kann damit nicht verarbeitet werden. Das XSLT zum Umwandeln der Bereiche und Tags kann nicht ablaufen und der Artikel kann somit nicht importiert werden. Es wird ein Fehlerartikel in NGEN angelegt, der mit der gleichen Namenskonvention “livingdocs-{Livingdocs-Document-ID}” gefunden werden kann. In dem Fehlerartikel steht die Ursache, weshalb der Import fehlgeschlagen hat, z.B.
"Fehler bei der Verarbeitung des Inhalts: Fehler beim Ausführen des Xslt 'Default#Master.Livingdocs':'„' is an unexpected token. The expected token is '"' or '''. Line 1, position 1496."
FAQ
Expand | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
Sind bestimmte Livingdocs-Artikel in PRINT NGEN nicht auffindbar, so kann z. B. ein Syntax-Fehler im JSON des Artikels vorliegen, der dazu führt, dass die Artikel nicht nach PRINT NGEN importiert werden können. In diesem Fall wird ein Fehlerartikel in PRINT NGEN erstellt, der mit der gleichen Namenskonvention “livingdocs-{Livingdocs-Document-ID}” gefunden werden kann. In dem Fehlerartikel steht die Ursache, weshalb der Import fehlgeschlagen hat, z.B. "Fehler bei der Verarbeitung des Inhalts: Fehler beim Ausführen des Xslt 'Default#Master.Livingdocs':'„' is an unexpected token. The expected token is '"' or '''. Line 1, position 1496." Eine mögliche Ursache kann sein, dass Links mit deutschen Anführungszeichen (unten und oben) übergeben werden. Diese müssen jedoch mit
Der Syntax-Fehler muss Livingdocs-seitig korrigiert werden. In diesem Beispiel kann der Artikel als kurzfristiger Workaround ohne Link nach PRINT NGEN übergeben werden. Nähere Informationen dazu, welche Textformate übernommen werden, finden Sie auch unter https://peiq.atlassian.net/wiki/spaces/PPSD/pages/1164935187/Produkt+bergreifender+Standard+Tags+Makros+Bereiche+f+r+XSLT+Stylesheets#Auszeichnungen-(Textformate). |
...
Include Page | ||||
---|---|---|---|---|
|
Nur für PEIQ Mitarbeiter:innen: