From 46a5f41b5ebfc4fb922b623608b6a4a362361219 Mon Sep 17 00:00:00 2001 From: "Christian F." Date: Mon, 4 May 2026 20:59:46 +0200 Subject: [PATCH 1/5] - do not simply cut off description texts but shorten them with a 10% margin for better readability. --- .../mserver/base/utils/SentenceShortener.java | 105 ++++++++++++++++++ .../mserver/base/utils/TextCleaner.java | 6 +- 2 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/mediathekview/mserver/base/utils/SentenceShortener.java diff --git a/src/main/java/de/mediathekview/mserver/base/utils/SentenceShortener.java b/src/main/java/de/mediathekview/mserver/base/utils/SentenceShortener.java new file mode 100644 index 00000000..2485b8cf --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/base/utils/SentenceShortener.java @@ -0,0 +1,105 @@ +package de.mediathekview.mserver.base.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public final class SentenceShortener { + private static final Pattern WHITESPACE_REGEX = Pattern.compile("\\s+"); + private static final Pattern SENTENCE_BOUNDARY_REGEX = Pattern.compile("(?<=[.!?])\\s+"); + private static final String SHORTENING_SUFFIX = "..."; + + private SentenceShortener() { + } + + /** + * Shortens text to a target length while preserving complete sentences. + * + *

Whitespace is normalized before shortening. If the text is already within the target + * length, the normalized text is returned unchanged. If adding the next sentence would exceed + * {@code targetLength + marginLength}, that sentence is omitted and {@code ...} is appended to + * the returned text. If the first sentence alone is already longer than the limit, it is kept + * whole. + * + * @param text the text to shorten; may be {@code null} + * @param targetLength the preferred target length; must be positive + * @param marginLength the allowed soft overflow beyond the target; must not be negative + * @return the shortened text, or {@code null} if the input is {@code null} or blank + * @throws IllegalArgumentException if {@code targetLength <= 0} or {@code marginLength < 0} + */ + public static String shorten(String text, int targetLength, int marginLength) { + if (targetLength <= 0) { + throw new IllegalArgumentException("targetLength must be positive"); + } + if (marginLength < 0) { + throw new IllegalArgumentException("marginLength must not be negative"); + } + + String normalized = normalize(text); + if (normalized == null || normalized.length() <= targetLength) { + return normalized; + } + + int softLimit = targetLength + marginLength; + String[] rawSentences = SENTENCE_BOUNDARY_REGEX.split(normalized); + List sentences = new ArrayList<>(); + for (String rawSentence : rawSentences) { + String sentence = rawSentence.trim(); + if (!sentence.isEmpty()) { + sentences.add(sentence); + } + } + if (sentences.isEmpty()) { + return normalized; + } + + List selectedSentences = new ArrayList<>(); + int currentLength = 0; + for (String sentence : sentences) { + int candidateLength = selectedSentences.isEmpty() + ? sentence.length() + : currentLength + 1 + sentence.length(); + if (candidateLength > softLimit) { + break; + } + selectedSentences.add(sentence); + currentLength = candidateLength; + } + + if (!selectedSentences.isEmpty()) { + String shortened = String.join(" ", selectedSentences); + return selectedSentences.size() < sentences.size() + ? shortened + SHORTENING_SUFFIX + : shortened; + } + return sentences.size() > 1 + ? sentences.getFirst() + SHORTENING_SUFFIX + : sentences.getFirst(); + } + + /** + * Shortens text to a target length without any soft overflow margin. + * + * @param text the text to shorten; may be {@code null} + * @param targetLength the preferred target length; must be positive + * @return the shortened text, or {@code null} if the input is {@code null} or blank + * @throws IllegalArgumentException if {@code targetLength <= 0} + */ + public static String shorten(String text, int targetLength) { + return shorten(text, targetLength, 0); + } + + /** + * Normalizes whitespace and trims a text value. + * + * @param text the text to normalize; may be {@code null} + * @return the normalized text, or {@code null} if the input is {@code null} or blank + */ + public static String normalize(String text) { + if (text == null) { + return null; + } + String normalized = WHITESPACE_REGEX.matcher(text).replaceAll(" ").trim(); + return normalized.isEmpty() ? null : normalized; + } +} diff --git a/src/main/java/de/mediathekview/mserver/base/utils/TextCleaner.java b/src/main/java/de/mediathekview/mserver/base/utils/TextCleaner.java index 6c383fec..ac6d0bc1 100644 --- a/src/main/java/de/mediathekview/mserver/base/utils/TextCleaner.java +++ b/src/main/java/de/mediathekview/mserver/base/utils/TextCleaner.java @@ -11,6 +11,7 @@ public class TextCleaner { private static final String CARRIAGE_RETURN = "\r"; private static final String NO_BREAK_SPACE = "\u00a0"; private static final int MAX_BESCHREIBUNG = 400; + private static final int MAX_BESCHREIBUNG_MARGIN_LENGTH = 40; private static final String[] GERMAN_GEOBLOCKING_TEXTS = { "+++ Aus rechtlichen Gründen ist der Film nur innerhalb von Deutschland abrufbar. +++", "+++ Aus rechtlichen Gründen ist diese Sendung nur innerhalb von Deutschland abrufbar. +++", @@ -64,10 +65,7 @@ private static String cleanGeoBlockingTexts(final String text) { } private static String shortenBeschreibung(final String text) { - if (text.length() > MAX_BESCHREIBUNG) { - return text.substring(0, MAX_BESCHREIBUNG) + "\n....."; - } - return text; + return SentenceShortener.shorten(text, MAX_BESCHREIBUNG, MAX_BESCHREIBUNG_MARGIN_LENGTH); } private static String beschreibungCleanUp( From 0b1ac40819223033f9795fe5a5131ec0d18a91f9 Mon Sep 17 00:00:00 2001 From: "Christian F." Date: Mon, 4 May 2026 21:28:28 +0200 Subject: [PATCH 2/5] - fix ARD and Phoenix description tests --- .../mserver/crawler/ard/tasks/ArdFilmDetailTaskTest.java | 2 +- .../crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/tasks/ArdFilmDetailTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/tasks/ArdFilmDetailTaskTest.java index 300dbed1..d3eb462c 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/tasks/ArdFilmDetailTaskTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/tasks/ArdFilmDetailTaskTest.java @@ -97,7 +97,7 @@ public static Collection data() { ), /*topic*/ "Fickt euch!", /*title*/ "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", - /*description*/ "Den Penis richtig waschen ist ganz einfach! Was ihr beachten müsst, um Infektionen und unangenehme Gerüche zu vermeiden, erfahrt ihr im Video. Du willst mehr? Dann abonniere meinen Kanal: https://www.youtube.com/channel/UC3ZkjIfabQzVypsQBd9-AIQ?sub_confirmation=1Fickt euch! bei Facebook: http://www.facebook.com/istdochnursexFickt euch! bei Instagram: http://www.instagram.com/istdochnursexFickt euc\n.....", + /*description*/ "Den Penis richtig waschen ist ganz einfach! Was ihr beachten müsst, um Infektionen und unangenehme Gerüche zu vermeiden, erfahrt ihr im Video. Du willst mehr? Dann abonniere meinen Kanal: https://www.youtube.com/channel/UC3ZkjIfabQzVypsQBd9-AIQ?sub_confirmation=1Fickt euch! bei Facebook: http://www.facebook.com/istdochnursexFickt euch! bei Instagram: http://www.instagram.com/istdochnursexFickt euch! bei Snapchat: @istdochnursex", /*date*/ LocalDateTime.parse("2016-12-13T15:00"), /*duration*/ Duration.parse("PT3M5S"), /*small*/ "http://localhost:50998/22679/files/21/01/30/2678992/22679-jqh9gFKRm8YDnC2.ism/22679-jqh9gFKRm8YDnC2-audio=152016-video=771000.m3u8", diff --git a/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java index 5ab09c71..6acb02f5 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java @@ -98,7 +98,7 @@ public static Collection data() { "(2/5): Persönlichkeit oder Öffentlichkeit?", LocalDateTime.of(2021, 4, 16, 15, 40, 0), Duration.ofMinutes(15).plusSeconds(1), - "Dürfen Medien die Namen Prominenter nennen, wenn gegen sie ermittelt wird? Diese Frage stellte sich zuletzt im Fall von Ex-Fußballnationalspieler Christoph Metzelder. Was ist wichtiger? Persönlichkeitsrechte oder das Interesse der Öffentlichkeit? Richterinnen und Richter müssen das von Fall zu Fall aufs Neue entscheiden und stecken dabei in einem juristischen Dilemma: Der Schutz der Persönlichkeit\n.....", + "Dürfen Medien die Namen Prominenter nennen, wenn gegen sie ermittelt wird? Diese Frage stellte sich zuletzt im Fall von Ex-Fußballnationalspieler Christoph Metzelder. Was ist wichtiger? Persönlichkeitsrechte oder das Interesse der Öffentlichkeit?...", "https://www.phoenix.de/sendungen/dokumentationen/alles-was-recht-ist/25-persoenlichkeit-oder-effentlichkeit-a-2120685.html", "/none/phoenix/21/04/210416_phx_doku_awri_2/2/210416_phx_doku_awri_2_776k_p11v13.mp4", "/none/phoenix/21/04/210416_phx_doku_awri_2/2/210416_phx_doku_awri_2_2328k_p35v13.mp4", @@ -117,7 +117,7 @@ public static Collection data() { "Handeln statt Reden: Impfpflicht für alle?", LocalDateTime.of(2021, 11, 14, 12, 0, 0), Duration.ofMinutes(58).plusSeconds(56), - "Corona ist mit voller Wucht zurück: Noch nie seit Beginn der Pandemie haben sich so viele Menschen infiziert wie in dieser Woche. Das RKI meldet täglich neue Rekordwerte bei der 7-Tage-Inzidenz. In Altenheimen sterben wieder Menschen und in manchen Regionen wie in Sachsen, Thüringen oder Bayern werden Intensivbetten knapp. Das kann tödlich sein - nicht nur für Covid-Kranke, sondern auch für Unfall\n.....", + "Corona ist mit voller Wucht zurück: Noch nie seit Beginn der Pandemie haben sich so viele Menschen infiziert wie in dieser Woche. Das RKI meldet täglich neue Rekordwerte bei der 7-Tage-Inzidenz. In Altenheimen sterben wieder Menschen und in manchen Regionen wie in Sachsen, Thüringen oder Bayern werden Intensivbetten knapp. Das kann tödlich sein - nicht nur für Covid-Kranke, sondern auch für Unfallopfer oder Notfallpatienten....", "https://www.phoenix.de/sendungen/gespraeche/presseclub/handeln-statt-reden-impfpflicht-fuer-alle-a-2320549.html", "/de/phoenix/21/11/211114_1200_phx_presseclub/1/211114_1200_phx_presseclub_776k_p11v13.mp4", "/de/phoenix/21/11/211114_1200_phx_presseclub/1/211114_1200_phx_presseclub_1496k_p13v13.mp4", From 1a301873ab683e055bfa768a1ccccd07dd8438ea Mon Sep 17 00:00:00 2001 From: "Christian F." Date: Mon, 4 May 2026 21:33:44 +0200 Subject: [PATCH 3/5] - fix Srf description tests --- .../crawler/srf/parser/SrfFilmJsonDeserializerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/de/mediathekview/mserver/crawler/srf/parser/SrfFilmJsonDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/srf/parser/SrfFilmJsonDeserializerTest.java index 633e6279..d0d7074e 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/srf/parser/SrfFilmJsonDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/srf/parser/SrfFilmJsonDeserializerTest.java @@ -89,7 +89,7 @@ public static Collection data() { "1 gegen 100 vom 17.05.2010", LocalDateTime.of(2010, 5, 17, 20, 7, 6), 3305100, - "Spannung pur, wenn Susanne Kunz die Frage stellt und der Kandidat zwar eine Ahnung hat aber nicht ganz sicher ist ob die Antwort stimmt. Dann wird es im Studio «1 gegen 100» ruhig und man spürt die Anspannung des Kandidaten förmlich. Nimmt er nun einen Joker zur Hilfe oder setzt er alles auf eine Karte und riskiert, ohne Geld und als Verlierer vom Platz zu gehen? Köpfchen, Mut und Taktik sind gefr\n.....", + "Spannung pur, wenn Susanne Kunz die Frage stellt und der Kandidat zwar eine Ahnung hat aber nicht ganz sicher ist ob die Antwort stimmt. Dann wird es im Studio «1 gegen 100» ruhig und man spürt die Anspannung des Kandidaten förmlich. Nimmt er nun einen Joker zur Hilfe oder setzt er alles auf eine Karte und riskiert, ohne Geld und als Verlierer vom Platz zu gehen? Köpfchen, Mut und Taktik sind gefragt....", "https://www.srf.ch/play/tv/1-gegen-100/video/1-gegen-100-vom-17-05-2010?urn=urn:srf:video:22b9dd2c-d1fd-463b-91de-d804eda74889", "https://hdvodsrforigin-f.akamaihd.net/i/vod/1gegen100/2010/05/1gegen100_20100517_200706_web_h264_16zu9_,lq1,mq1,hq1,.mp4.csmil/index_2_av.m3u8", "", @@ -161,7 +161,7 @@ public static Collection data() { "Cliqme – Der Berner Star im Kosovo", LocalDateTime.of(2020, 1, 26, 22, 25, 0), 1319000, - "Seit einem Jahr wohnt Gassann Nyangi in Pristina. Der sprachbegabte Berner spricht bereits Albanisch mit kosovarischem Akzent. Das gefällt den Einheimischen: Seit er gemeinsam mit dem kosovarischen Rapper Capital T. einen Song produziert hat, wurde Cliqme dort auf einen Schlag bekannt. In der Schweiz trat er bereits als MC auf – als sogenannter Warmup für Superstars. Jetzt reisst Cliqme auf der Bü\n.....", + "Seit einem Jahr wohnt Gassann Nyangi in Pristina. Der sprachbegabte Berner spricht bereits Albanisch mit kosovarischem Akzent. Das gefällt den Einheimischen: Seit er gemeinsam mit dem kosovarischen Rapper Capital T. einen Song produziert hat, wurde Cliqme dort auf einen Schlag bekannt. In der Schweiz trat er bereits als MC auf – als sogenannter Warmup für Superstars. Jetzt reisst Cliqme auf der Bühne die jungen Kosovaren mit....", "https://www.srf.ch/play/tv/reporter/video/cliqme--der-berner-star-im-kosovo?urn=urn:srf:video:2b08d6d3-9a7a-4827-9f7b-20f89e1ad144", "https://hdvodsrforigin-f.akamaihd.net/i/vod/reporter/2019/12/reporter_20191211_172931_18722867_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index_0_av.m3u8", "https://hdvodsrforigin-f.akamaihd.net/i/vod/reporter/2019/12/reporter_20191211_172931_18722867_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index_5_av.m3u8", @@ -179,7 +179,7 @@ public static Collection data() { "Modeschau (Staffel 1, Folge 29)", LocalDateTime.of(2022, 3, 17, 15, 10, 0), 1559400, - "Im Motel geht es zu wie in einem Bienenhaus – in einem der glamourösen Art: Der rührige Motel-Direktor Bieri hat eine Modeschau organisiert. Bei dieser Gelegenheit begegnet er seiner Ex-Freundin Roberta. Sie ist als Stylistin für die Models tätig. Verblüfft und auch etwas eifersüchtig erfährt Bieri, dass Roberta inzwischen geheiratet hat. Als sie ihm ihren Gatten vorstellt, fallen dem Direktor fas\n.....", + "Im Motel geht es zu wie in einem Bienenhaus – in einem der glamourösen Art: Der rührige Motel-Direktor Bieri hat eine Modeschau organisiert. Bei dieser Gelegenheit begegnet er seiner Ex-Freundin Roberta. Sie ist als Stylistin für die Models tätig. Verblüfft und auch etwas eifersüchtig erfährt Bieri, dass Roberta inzwischen geheiratet hat....", "https://www.srf.ch/play/tv/motel/video/modeschau-(staffel-1-folge-29)?urn=urn:srf:video:7aae02fd-efb2-43de-8521-babd80718e89", "http://localhost:8589/world/hls/motel/2022/03/motel_20220314_001922_9130234_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index-f4-v1-a1.m3u8", "http://localhost:8589/world/hls/motel/2022/03/motel_20220314_001922_9130234_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/index-f5-v1-a1.m3u8", From afb6739e08a1f2a60ff31c4dc9863971611eec76 Mon Sep 17 00:00:00 2001 From: "Christian F." Date: Mon, 4 May 2026 21:54:05 +0200 Subject: [PATCH 4/5] - fix Ard description tests --- .../crawler/ard/json/ArdFilmDeserializerTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializerTest.java index b1de5db1..23412e66 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializerTest.java @@ -113,7 +113,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_DGS_UT_AD.json", /*topic*/ "Tatort", /*title*/ "Der Fluch des Geldes", - /*description*/ "Spielfilm Deutschland 2024 +++ \"Der Fluch des Geldes\" beginnt da, wo \"Die Kälte der Erde\" endete. Die Hauptkommissare streiten sich, denn Leo Hölzer musste entdecken, dass sein Partner Adam Schürk im Besitz der Beute aus einem Bankraub seines verstorbenen Vaters ist. +++ Mit Vladimir Burlakov, Daniel Sträßer, Susanne Bormann, Omar El-Saeidi, Jasmina Al Zihairi u.a. | Buch: Hendrik Hölzemann \n.....", + /*description*/ "Spielfilm Deutschland 2024 +++ \"Der Fluch des Geldes\" beginnt da, wo \"Die Kälte der Erde\" endete. Die Hauptkommissare streiten sich, denn Leo Hölzer musste entdecken, dass sein Partner Adam Schürk im Besitz der Beute aus einem Bankraub seines verstorbenen Vaters ist. +++ Mit Vladimir Burlakov, Daniel Sträßer, Susanne Bormann, Omar El-Saeidi, Jasmina Al Zihairi u.a. | Buch: Hendrik Hölzemann | Regie: Christian Theede", /*date*/ LocalDateTime.parse("2024-01-28T20:15"), /*duration*/ Duration.parse("PT1H28M33S"), /*small*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_640x360-50p-1200kbit.mp4", @@ -153,7 +153,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_STD_DasErste.json", /*topic*/ "tagesschau", /*title*/ "tagesschau 11:10 Uhr, 01.05.2024", - /*description*/ "Bundesweit Kundgebungen zum Tag der Arbeit für bessere Arbeitsbedingungen, Bereits erste Demonstrationen in Berlin und Hamburg, Polizei in Georgiens Hauptstadt Tiflis geht massiv gegen pro-europäische Demonstranten vor, US-Einsatzkräfte räumen mit Großaufgebot besetztes Gebäude der Columbia Universität in New York, US-Bestsellerautor Paul Auster stirbt im Alter von 77 Jahren, Walpurgisnacht im Har\n.....", + /*description*/ "Bundesweit Kundgebungen zum Tag der Arbeit für bessere Arbeitsbedingungen, Bereits erste Demonstrationen in Berlin und Hamburg, Polizei in Georgiens Hauptstadt Tiflis geht massiv gegen pro-europäische Demonstranten vor, US-Einsatzkräfte räumen mit Großaufgebot besetztes Gebäude der Columbia Universität in New York, US-Bestsellerautor Paul Auster stirbt im Alter von 77 Jahren, Walpurgisnacht im Harz, Das Wetter", /*date*/ LocalDateTime.parse("2024-05-01T11:10"), /*duration*/ Duration.parse("PT5M6S"), /*small*/ "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webm.h264.mp4", @@ -213,7 +213,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_STD_ONE.json", /*topic*/ "Murdoch Mysteries", /*title*/ "Folge 4: Geisterstunde (S01/E04) (Originalversion)", - /*description*/ "Murdoch schließt sich mit seinem Helden Arthur Conan Doyle zusammen, um einen Mord aufzuklären, der während einer Séance unter der Leitung des Mediums Sarah Pensall aufgedeckt wurde. Es scheint, dass das Opfer Ida Winston, Mitglied einer paranormalen Wächtergruppe, nicht von Sarahs Fähigkeiten überzeugt war. Murdoch fragt sich, ob Sarah Ida getötet hat, weil sie kurz davorstand, als Betrügerin ent\n.....", + /*description*/ "Murdoch schließt sich mit seinem Helden Arthur Conan Doyle zusammen, um einen Mord aufzuklären, der während einer Séance unter der Leitung des Mediums Sarah Pensall aufgedeckt wurde. Es scheint, dass das Opfer Ida Winston, Mitglied einer paranormalen Wächtergruppe, nicht von Sarahs Fähigkeiten überzeugt war. Murdoch fragt sich, ob Sarah Ida getötet hat, weil sie kurz davorstand, als Betrügerin entlarvt zu werden.", /*date*/ LocalDateTime.parse("2024-05-01T04:15"), /*duration*/ Duration.parse("PT46M4S"), /*small*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089636.mp4", @@ -233,7 +233,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_STD_RBB.json", /*topic*/ "Blue Moon", /*title*/ "Blue Moon vom 30.04.2024", - /*description*/ "Den Rucksack auskippen, bloßstellende Fotos posten oder Beleidigungen nachrufen - fast jedes sechste Schulkind ist bei uns von Mobbing betroffen. Aber auch im Büro, an der Uni oder im Verein gibt es Mobbing! Diese Woche sprechen wir bei Fritz über das Thema Mobbing, alle Inhalte und Hilfsangebote findet ihr hier: fritz.de/mobbing. Claudia Kamieth will deshalb heute im Blue Moon von euch wissen: Wu\n.....", + /*description*/ "Den Rucksack auskippen, bloßstellende Fotos posten oder Beleidigungen nachrufen - fast jedes sechste Schulkind ist bei uns von Mobbing betroffen. Aber auch im Büro, an der Uni oder im Verein gibt es Mobbing! Diese Woche sprechen wir bei Fritz über das Thema Mobbing, alle Inhalte und Hilfsangebote findet ihr hier: fritz.de/mobbing....", /*date*/ LocalDateTime.parse("2024-04-30T22:15"), /*duration*/ Duration.parse("PT1H43M15S"), /*small*/ "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc360.mp4", @@ -253,7 +253,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_STD_AD_DasErste.json", /*topic*/ "Mord mit Aussicht", /*title*/ "Folge 3: Die Bestechlichen (S05/E03)", - /*description*/ "Marie zögert noch bei Gisberts Angebot, zu ihm auf den Schweine-Hof zu ziehen. Willkommene Ablenkung bietet Marie eine Leiche im Heuballen auf Müller Schlichtings Wiese. Der Tote ist Albert Appel, der mit seinem Bruder Kai einen Bauernhof betreibt und außerdem Schiedsrichter der Regionalliga ist. Die Ermittlungen führen in die Welt des Fußballs und zweier rivalisierender Clubs. Das Auftauchen ein\n.....", + /*description*/ "Marie zögert noch bei Gisberts Angebot, zu ihm auf den Schweine-Hof zu ziehen. Willkommene Ablenkung bietet Marie eine Leiche im Heuballen auf Müller Schlichtings Wiese. Der Tote ist Albert Appel, der mit seinem Bruder Kai einen Bauernhof betreibt und außerdem Schiedsrichter der Regionalliga ist. Die Ermittlungen führen in die Welt des Fußballs und zweier rivalisierender Clubs....", /*date*/ LocalDateTime.parse("2024-04-30T20:15"), /*duration*/ Duration.parse("PT47M20S"), /*small*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955169.mp4", @@ -273,7 +273,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_STD_AD_MDR.json", /*topic*/ "Auf schmaler Spur", /*title*/ "Reichsbahn-Oldies im Trend", - /*description*/ "Mit gerade mal 27 Jahren ist Tobias Sambill Geschäftsführer des „Salzland Railservice“ in Bernburg. Seine Geschäftsidee: Er betreibt Güterverkehr mit alten Reichsbahnloks und ist ganz verrückt nach „Ludmilla“, Baujahr 1974, 3.000 PS Leistung. Ludmilla ist der Spitzname für Dieselloks der Baureihe 130, die ab 1970 aus der Sowjetunion zur Reichsbahn kamen. Auch in Löbau ist der Nachwuchs schon in d\n.....", + /*description*/ "Mit gerade mal 27 Jahren ist Tobias Sambill Geschäftsführer des „Salzland Railservice“ in Bernburg. Seine Geschäftsidee: Er betreibt Güterverkehr mit alten Reichsbahnloks und ist ganz verrückt nach „Ludmilla“, Baujahr 1974, 3.000 PS Leistung. Ludmilla ist der Spitzname für Dieselloks der Baureihe 130, die ab 1970 aus der Sowjetunion zur Reichsbahn kamen. Auch in Löbau ist der Nachwuchs schon in der Verantwortung....", /*date*/ LocalDateTime.parse("2024-05-01T13:20"), /*duration*/ Duration.parse("PT29M31S"), /*small*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-41dd60577440_a6.mp4", @@ -313,7 +313,7 @@ public static Collection data() { /*jsonFile*/ "/ard/ard_item_ignore_OV.json", /*topic*/ "You shall not lie - Tödliche Geheimnisse", /*title*/ "Folge 4: Der Verrat (S01/E04)", - /*description*/ "Zwischen Macarena und Iván, der jetzt von ihrer Schwangerschaft weiß, kommt es zu einer dramatischen Auseinandersetzung auf See. Erschöpft schwimmt der 18-Jährige an Land und beschuldigt sie, ihn vom Boot gestoßen zu haben. Die Lehrerin muss nun nicht nur die Folgen ihres Seitensprungs fürchten, sondern auch eine Anzeige wegen versuchten Totschlags. +++ Sechsteilige Thrillerserie, Spanien 2021\n.....", + /*description*/ "Zwischen Macarena und Iván, der jetzt von ihrer Schwangerschaft weiß, kommt es zu einer dramatischen Auseinandersetzung auf See. Erschöpft schwimmt der 18-Jährige an Land und beschuldigt sie, ihn vom Boot gestoßen zu haben. Die Lehrerin muss nun nicht nur die Folgen ihres Seitensprungs fürchten, sondern auch eine Anzeige wegen versuchten Totschlags....", /*date*/ LocalDateTime.parse("2022-10-15T02:50"), /*duration*/ Duration.parse("PT42M18S"), /*small*/ "https://pd-videos.daserste.de/de/2022/10/11/1cb6c5d8-c0f4-4868-ac42-2a06b7a3381f/JOB_461836_sendeton_640x360-50p-1200kbit.mp4", From 28227995945a7958c418d2b06468fbc6110785a1 Mon Sep 17 00:00:00 2001 From: "Christian F." Date: Mon, 4 May 2026 22:15:12 +0200 Subject: [PATCH 5/5] - fix Orf description tests --- .../mserver/crawler/orfon/OrfOnEpisodeTaskTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/de/mediathekview/mserver/crawler/orfon/OrfOnEpisodeTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/orfon/OrfOnEpisodeTaskTest.java index 3c8519cd..cd8ef078 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/orfon/OrfOnEpisodeTaskTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/orfon/OrfOnEpisodeTaskTest.java @@ -44,7 +44,7 @@ public void testNormal_1() { assertEquals("Servus Kasperl: Kasperl & Strolchi: Koko und Maximilian",actual.getTitel()); assertEquals("Servus Kasperl",actual.getThema()); assertEquals(LocalDateTime.of(2024,01,04,07,07,38),actual.getTime()); - assertEquals("Kasperl und Strolchi besuchen den Zirkusdirektor des Zirkus Kindleroni. Dieser ist verzweifelt, weil sein Stallbursche krank ist und er die ganze Arbeit alleine kaum schaffen kann. Doch da kommt Hilfe durch Maximilian, der Arbeit sucht. Sofort darf Maximilian die Stelle als Stallbursche antreten. Eine seiner Aufgaben ist es auch auf Koko, den Papagei des Direktors, aufzupassen. Dieser ist in Gefah",actual.getBeschreibung().substring(0,400)); + assertEquals("Kasperl und Strolchi besuchen den Zirkusdirektor des Zirkus Kindleroni. Dieser ist verzweifelt, weil sein Stallbursche krank ist und er die ganze Arbeit alleine kaum schaffen kann. Doch da kommt Hilfe durch Maximilian, der Arbeit sucht. Sofort darf Maximilian die Stelle als Stallbursche antreten. Eine seiner Aufgaben ist es auch auf Koko, den Papagei des Direktors, aufzupassen....",actual.getBeschreibung()); assertEquals(Duration.parse("PT21M56S"),actual.getDuration()); assertEquals(Optional.of(URI.create("https://tvthek.orf.at/profile/Servus-Kasperl/3272601/Servus-Kasperl-Kasperl-Strolchi-Koko-und-Maximilian/14207792").toURL()),actual.getWebsite()); assertTrue(List.of(GeoLocations.GEO_NONE).containsAll(actual.getGeoLocations())); @@ -77,7 +77,7 @@ public void testNormal_2() { assertEquals("ABC Bär",actual.getTitel()); assertEquals("ABC-Bär",actual.getThema()); assertEquals(LocalDateTime.of(2024,01,04,06,45),actual.getTime()); - assertEquals("Der ABC Bär und seine Tierfreunde reisen mit ihrem lustigen Baumhaus durch das Land, um ihre Zahl- und Buchstabenspiele aufzuführen und erleben dabei jede Menge spannender Geschichten. Bildquelle: ORF",actual.getBeschreibung()); + assertEquals("Der ABC Bär und seine Tierfreunde reisen mit ihrem lustigen Baumhaus durch das Land, um ihre Zahl- und Buchstabenspiele aufzuführen und erleben dabei jede Menge spannender Geschichten. Bildquelle: ORF",actual.getBeschreibung()); assertEquals(Duration.parse("PT13M29S"),actual.getDuration()); assertEquals(Optional.of(URI.create("https://tvthek.orf.at/profile/ABC-Baer/4611813/ABC-Baer/14207790").toURL()),actual.getWebsite()); assertTrue(List.of(GeoLocations.GEO_AT).containsAll(actual.getGeoLocations())); @@ -113,7 +113,7 @@ public void testZib() { "ZIB 13:00 vom 20.03.2024", LocalDateTime.of(2024, 3, 20, 13, 0, 0), Duration.ofSeconds(1177), - "Wohnbaupaket passiert Nationalrat | ORF-Analyse: Details zum Wohnbaupaket | Neue Lehrerausbildung kommt ein Jahr später | Agrarprodukte aus Ukraine werden wieder verzollt | ORF-Analyse: Zölle auf Landwirtschaftsgüter aus Ukraine | London: Zweiter Anlauf für \"Ruanda-Plan\" | Vorschau: GB stimmt über \"Ruanda-Plan\" ab | 2023: Über 1.300 Vorfälle von Rassismus in Österreich | Rekordhoch bei Insolvenze\n.....", + "Wohnbaupaket passiert Nationalrat | ORF-Analyse: Details zum Wohnbaupaket | Neue Lehrerausbildung kommt ein Jahr später | Agrarprodukte aus Ukraine werden wieder verzollt | ORF-Analyse: Zölle auf Landwirtschaftsgüter aus Ukraine | London: Zweiter Anlauf für \"Ruanda-Plan\" | Vorschau: GB stimmt über \"Ruanda-Plan\" ab | 2023: Über 1.300 Vorfälle von Rassismus in Österreich | Rekordhoch bei Insolvenzen | Kredit für Signa-Immobiliensparte in Aussicht?...", "https://tvthek.orf.at/profile/ZIB-1300/71280/ZIB-1300-vom-20-03-2024/14218665", new GeoLocations[] { GeoLocations.GEO_NONE}, "https://apasfiis.sf.apa.at/ipad/cms-worldwide_episodes/14218665_0017_Q4A.mp4/playlist.m3u8", @@ -133,7 +133,7 @@ public void testAD() { assertEquals("Vorstadtweiber: Folge 18 (Audiodeskription)",actual.getTitel()); assertEquals("Vorstadtweiber Staffel 2",actual.getThema()); assertEquals(LocalDateTime.of(2023,12,06,23,07,52),actual.getTime()); - assertEquals("Chaos wegen der Entführung von Waltrauds Baby. Die betrunkene Sylvia sagt, sie habe Simon vor der Türe gesehen. Waltraud ist sofort klar, dass nur Simon der Entführer sein kann. Den trifft sie zuhause, wo er gerade packt, um abzuhauen. Er beteuert, das Baby nicht entführt zu haben. Währenddessen rast Vanessa mit ihrem Wagen durch die Stadt, verheult, überdreht, ein Baby am Rücksitz. Daheim angekom",actual.getBeschreibung().substring(0,400)); + assertEquals("Chaos wegen der Entführung von Waltrauds Baby. Die betrunkene Sylvia sagt, sie habe Simon vor der Türe gesehen. Waltraud ist sofort klar, dass nur Simon der Entführer sein kann. Den trifft sie zuhause, wo er gerade packt, um abzuhauen. Er beteuert, das Baby nicht entführt zu haben. Währenddessen rast Vanessa mit ihrem Wagen durch die Stadt, verheult, überdreht, ein Baby am Rücksitz....",actual.getBeschreibung()); assertEquals(Duration.parse("PT46M32S"),actual.getDuration()); assertEquals(Optional.of(URI.create("https://tvthek.orf.at/profile/AD-Vorstadtweiber-Staffel-2/13895877/AD-Vorstadtweiber-Folge-18/14204417").toURL()),actual.getWebsite()); assertTrue(List.of(GeoLocations.GEO_AT).containsAll(actual.getGeoLocations())); @@ -168,7 +168,7 @@ public void testArchive() { assertEquals("ORF-Mitarbeiter in Quarantäne",actual.getTitel()); assertEquals("Best of \"ZIB 2\"-Interviews",actual.getThema()); assertEquals(LocalDateTime.of(2020,03,25,13,10),actual.getTime()); - assertEquals("Der ORF hat während der Coronakrise 2020 eine besondere Vorsichtsmaßnahme getroffen, um den Betrieb sicherzustellen. Einige Mitarbeiter und Moderatoren des Senders sind vorübergehend in das ORF-Zentrum am Küniglberg gezogen. Dort wird in \"Sperrzonen\" gearbeitet und der Sendebetrieb aufrecht erhalten. Sendung: Mittag in Österreich Gestaltung: Stefan Schlager",actual.getBeschreibung()); + assertEquals("Der ORF hat während der Coronakrise 2020 eine besondere Vorsichtsmaßnahme getroffen, um den Betrieb sicherzustellen. Einige Mitarbeiter und Moderatoren des Senders sind vorübergehend in das ORF-Zentrum am Küniglberg gezogen. Dort wird in \"Sperrzonen\" gearbeitet und der Sendebetrieb aufrecht erhalten. Sendung: Mittag in Österreich Gestaltung: Stefan Schlager",actual.getBeschreibung()); assertEquals(Duration.parse("PT3M30S"),actual.getDuration()); assertEquals(Optional.of(URI.create("https://tvthek.orf.at/profile/Archiv/7648449/ORF-Mitarbeiter-in-Quarantaene/14046198").toURL()),actual.getWebsite()); assertTrue(List.of(GeoLocations.GEO_NONE).containsAll(actual.getGeoLocations()));