diff --git a/MServer-Config.yaml b/MServer-Config.yaml index d4684761d..f340cc696 100644 --- a/MServer-Config.yaml +++ b/MServer-Config.yaml @@ -27,7 +27,7 @@ maximumRequestsPerSecond: 999.0 # If set only these Sender will be crawled all other will be ignored. senderIncluded: - - ARD + # - ARD #- ARTE_DE #- ARTE_FR #- ARTE_PL @@ -41,6 +41,7 @@ senderIncluded: #- PHOENIX #- SRF #- SR + - TAGESSCHAU24 #- ZDF #SRF,SR,PHONIX,ORF,KIKA,DW,3SAT< diff --git a/pom.xml b/pom.xml index c56c407ac..a1db8df7c 100644 --- a/pom.xml +++ b/pom.xml @@ -279,6 +279,12 @@ ${mockito.version} test + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + org.hamcrest hamcrest diff --git a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java index 194d469ad..b4f881b6a 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java +++ b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java @@ -1,5 +1,6 @@ package de.mediathekview.mserver.crawler; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauCrawler; import de.mediathekview.mserver.daten.Film; import de.mediathekview.mserver.daten.Filmlist; import de.mediathekview.mserver.daten.Sender; @@ -547,6 +548,8 @@ private void initializeCrawler(final MServerConfigManager rootConfig) { Sender.SRF, new SrfCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); crawlerMap.put( Sender.SR, new SrCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); + crawlerMap.put( + Sender.TAGESSCHAU24, new TagesschauCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); crawlerMap.put( Sender.ZDF, new ZdfCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); } diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/EntryUrlDto.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/EntryUrlDto.java new file mode 100644 index 000000000..6710533e7 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/EntryUrlDto.java @@ -0,0 +1,32 @@ +package de.mediathekview.mserver.crawler.tagesschau; + +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; + +import java.util.HashSet; +import java.util.Set; + +public class EntryUrlDto { + private final Set videos; + private final Set subPages; + + public EntryUrlDto() { + this.videos = new HashSet<>(); + this.subPages = new HashSet<>(); + } + + public Set getVideos() { + return videos; + } + + public Set getSubPages() { + return subPages; + } + + public void addVideo(CrawlerUrlDTO videoUrl) { + this.videos.add(videoUrl); + } + + public void addSubPage(CrawlerUrlDTO subPageUrl) { + this.subPages.add(subPageUrl); + } +} \ No newline at end of file diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauConstants.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauConstants.java new file mode 100644 index 000000000..237014d64 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauConstants.java @@ -0,0 +1,18 @@ +package de.mediathekview.mserver.crawler.tagesschau; + +/** + * Constants for the Tagesschau crawler. + * Handles the "vor 20 Jahren" (20 years ago) archive with daily news broadcasts. + */ +public final class TagesschauConstants { + + // Starting point: Tagesschau vor 20 Jahren (20 years ago) + public static final String ARCHIVE_START_URL = "https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-142.html"; + + // Private constructor to hide the implicit public one + private TagesschauConstants() { + // Utility class, do not instantiate + } +} + + diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauCrawler.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauCrawler.java new file mode 100644 index 000000000..9b7771ccf --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/TagesschauCrawler.java @@ -0,0 +1,98 @@ +package de.mediathekview.mserver.crawler.tagesschau; + +import de.mediathekview.mserver.crawler.tagesschau.tasks.TagesschauEntriesTask; +import de.mediathekview.mserver.crawler.tagesschau.tasks.TagesschauVideoTask; +import de.mediathekview.mserver.daten.Film; +import de.mediathekview.mserver.daten.Sender; +import de.mediathekview.mserver.base.messages.listener.MessageListener; +import de.mediathekview.mserver.base.config.MServerConfigManager; +import de.mediathekview.mserver.base.messages.ServerMessages; +import de.mediathekview.mserver.crawler.basic.AbstractCrawler; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.progress.listeners.SenderProgressListener; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RecursiveTask; + +public class TagesschauCrawler extends AbstractCrawler { + + private static final Logger LOG = LogManager.getLogger(TagesschauCrawler.class); + + public TagesschauCrawler( + final ForkJoinPool aForkJoinPool, + final Collection aMessageListeners, + final Collection aProgressListeners, + final MServerConfigManager rootConfig) { + super(aForkJoinPool, aMessageListeners, aProgressListeners, rootConfig); + } + + @Override + public Sender getSender() { + return Sender.TAGESSCHAU24; + } + + @Override + protected RecursiveTask> createCrawlerTask() { + try { + Set videos = new HashSet<>(); + Queue inputQueue = createArchiveUrl(); + + // short run uses 2 recursion -> only the actual month is included + int recursionMax = Boolean.TRUE.equals(crawlerConfig.getTopicsSearchEnabled()) ? 10 : 2; + int recursionCount = 0; + + while (!inputQueue.isEmpty() && recursionCount < recursionMax) { + LOG.debug("processing {} sub pages", inputQueue.size()); + TagesschauEntriesTask round1 = new TagesschauEntriesTask(this, inputQueue); + final Set results = this.forkJoinPool.submit(round1).get(); + + Set subPages = new HashSet<>(); + results.forEach( + result -> { + videos.addAll(result.getVideos()); + subPages.addAll(result.getSubPages()); + }); + inputQueue = new ConcurrentLinkedQueue<>(subPages); + recursionCount++; + } + + final Queue videosFiltered = this.filterExistingFilms(videos, CrawlerUrlDTO::getUrl); + getAndSetMaxCount(videosFiltered.size()); + + printMessage( + ServerMessages.DEBUG_ALL_SENDUNG_FOLGEN_COUNT, + getSender().getName(), + videosFiltered.size()); + + return new TagesschauVideoTask(this, new ConcurrentLinkedQueue<>(videosFiltered)); + + } catch (final InterruptedException ex) { + LOG.fatal("Exception in Tagesschau crawler.", ex); + Thread.currentThread().interrupt(); + } catch (final ExecutionException ex) { + LOG.fatal("Exception in Tagesschau crawler.", ex); + } + return new RecursiveTask<>() { + @Override + protected Set compute() { + return Set.of(); + } + }; + } + + private Queue createArchiveUrl() { + Queue urls = new ConcurrentLinkedQueue<>(); + urls.add(new CrawlerUrlDTO(TagesschauConstants.ARCHIVE_START_URL)); + return urls; + } +} + + diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializer.java new file mode 100644 index 000000000..b8599e1d1 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializer.java @@ -0,0 +1,201 @@ +package de.mediathekview.mserver.crawler.tagesschau.json; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import de.mediathekview.mserver.base.utils.JsonUtils; +import de.mediathekview.mserver.crawler.basic.AbstractCrawler; +import de.mediathekview.mserver.daten.*; +import java.lang.reflect.Type; +import java.net.MalformedURLException; +import java.net.URI; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class TagesschauVideoDeserializer implements JsonDeserializer> { + private static final String ELEMENT_MC = "mc"; + private static final String ELEMENT_MEDIA = "media"; + private static final String ELEMENT_META = "meta"; + private static final String ELEMENT_PLUG_IN_DATA = "pluginData"; + private static final String ELEMENT_SHARING_WEB = "sharing@web"; + private static final String ELEMENT_STREAMS = "streams"; + + private static final String ATTRIBUTE_DATE = "broadcastedOnDateTime"; + private static final String ATTRIBUTE_DURATION = "durationSeconds"; + private static final String ATTRIBUTE_TOPIC = "seriesTitle"; + private static final String ATTRIBUTE_TITLE = "title"; + + private static final String ATTRIBUTE_WIDTH = "maxHResolutionPx"; + private static final String ATTRIBUTE_MIMETYPE = "mimeType"; + private static final String ATTRIBUTE_URL = "url"; + private static final String ATTRIBUTE_LINK = "link"; + private static final String[] SUPPORTED_MIME_TYPES = new String[] { "video/mp4" }; + + private static final Pattern LONG_MONTH_PATTERN = + Pattern.compile("(\\d{1,2}(?:\\.|\\s)\\s*[A-Za-zÄÖÜäöüß]+\\s+\\d{4})"); + private static final DateTimeFormatter GERMAN_LONG = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendPattern("d. MMMM uuuu") + .toFormatter(Locale.GERMAN); + private static final DateTimeFormatter GERMAN_LONG_NO_SPACE = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendPattern("d.MMMM uuuu") + .toFormatter(Locale.GERMAN); + private static final DateTimeFormatter GERMAN_LONG_NO_DOT = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendPattern("d MMMM uuuu") + .toFormatter(Locale.GERMAN); + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY); + private static final String GERMAN_TIME_ZONE = "Europe/Berlin"; + private static final Logger LOG = LogManager.getLogger(TagesschauVideoDeserializer.class); + private final AbstractCrawler crawler; + + public TagesschauVideoDeserializer(AbstractCrawler crawler) { + this.crawler = crawler; + } + + private static Optional parseDate(final JsonObject metaObject, final Optional titleDate) { + final Optional dateValue = + JsonUtils.getAttributeAsString(metaObject, ATTRIBUTE_DATE); + if (dateValue.isPresent()) { + try { + final OffsetDateTime inputDateTime = OffsetDateTime.parse(dateValue.get(), DATE_TIME_FORMATTER); + LocalDateTime localDateTime = inputDateTime.atZoneSameInstant(ZoneId.of(GERMAN_TIME_ZONE)).toLocalDateTime(); + if (titleDate.isPresent() && titleDate.get().getYear() != localDateTime.getYear()) { + localDateTime = localDateTime.withYear(titleDate.get().getYear()); + } + return Optional.of(localDateTime); + } catch (final DateTimeParseException ex) { + LOG.warn("Error parsing date time value {}", dateValue.get(), ex); + } + } + + return titleDate.map(localDate -> LocalDateTime.of(localDate, LocalTime.of(20, 0))); + } + + @Override + public List deserialize( + JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) { + + final List results = new ArrayList<>(); + + Optional mcElement = JsonUtils.getElement(jsonElement, ELEMENT_MC); + if (mcElement.isPresent()) { + final Optional metaElement = JsonUtils.getElement(mcElement.get(), ELEMENT_META); + if (metaElement.isPresent()) { + final JsonObject metaObject = metaElement.get().getAsJsonObject(); + final Optional topic = JsonUtils.getAttributeAsString(metaObject, ATTRIBUTE_TOPIC); + final Optional title = JsonUtils.getAttributeAsString(metaObject, ATTRIBUTE_TITLE); + final Optional duration = JsonUtils.getAttributeAsInt(metaObject, ATTRIBUTE_DURATION); + final Optional date = parseDate(metaObject, parseDateFromTitle(title.orElse(""))); + final Map urls = parseUrls(mcElement.get().getAsJsonObject()); + final String website = parseWebsite(mcElement.get().getAsJsonObject()); + + final Film film = + new Film( + UUID.randomUUID(), + Sender.TAGESSCHAU24, + title.orElse(""), + topic.orElse(""), + date.orElse(LocalDateTime.now()), + duration.isEmpty() ? Duration.ofSeconds(0) : Duration.ofSeconds(duration.get())); + film.addGeolocation(GeoLocations.GEO_NONE); + if (!website.isEmpty()) { + try { + film.setWebsite(URI.create(website).toURL()); + } catch (MalformedURLException e) { + LOG.error("Invalid website URL: {}", website, e); + } + } + + urls.forEach((resolution, url) -> { + try { + film.addUrl(resolution, new FilmUrl(url, crawler.determineFileSizeInKB(url))); + } catch (final MalformedURLException ex) { + LOG.error("InvalidUrl: {}", url, ex); + } + }); + + results.add(film); + } + } + + return results; + } + + private Optional parseDateFromTitle(String title) { + Matcher m = LONG_MONTH_PATTERN.matcher(title); + if (m.find()) { + String datePart = m.group(1).replaceAll("\\s+", " ").trim(); + try { + return Optional.of(LocalDate.parse(datePart, GERMAN_LONG)); + } catch (DateTimeParseException ignored) { + // try other conversion + } + try { + return Optional.of(LocalDate.parse(datePart, GERMAN_LONG_NO_SPACE)); + } catch (DateTimeParseException ignored) { + // try other conversion + } + try { + return Optional.of(LocalDate.parse(datePart, GERMAN_LONG_NO_DOT)); + } catch (DateTimeParseException ex) { + LOG.debug("no valid date converted", ex); + } + } + return Optional.empty(); + } + + private String parseWebsite(JsonObject mcObject) { + return JsonUtils.getElementValueAsString(mcObject, ELEMENT_PLUG_IN_DATA, ELEMENT_SHARING_WEB, ATTRIBUTE_LINK).orElse(""); + } + + private Map parseUrls(final JsonObject mcObject) { + final Map urls = new EnumMap<>(Resolution.class); + if (mcObject.has(ELEMENT_STREAMS) && mcObject.get(ELEMENT_STREAMS).isJsonArray()) { + mcObject + .get(ELEMENT_STREAMS) + .getAsJsonArray() + .forEach( + stream -> { + final JsonObject streamObject = stream.getAsJsonObject(); + if (streamObject.has(ELEMENT_MEDIA) + && streamObject.get(ELEMENT_MEDIA).isJsonArray()) { + streamObject + .get(ELEMENT_MEDIA) + .getAsJsonArray() + .forEach( + media -> { + final Optional mimeType = + JsonUtils.getElementValueAsString(media, ATTRIBUTE_MIMETYPE); + if (mimeType.isPresent() + && Arrays.stream(SUPPORTED_MIME_TYPES) + .anyMatch(type -> type.equals(mimeType.get()))) { + final Optional width = + JsonUtils.getAttributeAsInt( + media.getAsJsonObject(), ATTRIBUTE_WIDTH); + final Optional url = + JsonUtils.getElementValueAsString(media, ATTRIBUTE_URL); + + if (width.isPresent() && url.isPresent()) { + final Resolution resolution = + Resolution.getResolutionFromWidth(width.get()); + urls.put(resolution, url.get()); + } + } + }); + } + }); + } + return urls; + } +} diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTask.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTask.java new file mode 100644 index 000000000..71755f2d6 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTask.java @@ -0,0 +1,75 @@ +package de.mediathekview.mserver.crawler.tagesschau.tasks; + +import de.mediathekview.mserver.crawler.basic.AbstractCrawler; +import de.mediathekview.mserver.crawler.basic.AbstractDocumentTask; +import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.crawler.tagesschau.EntryUrlDto; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauConstants; + +import java.util.Arrays; +import java.util.Queue; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.jspecify.annotations.NonNull; + +public class TagesschauEntriesTask extends AbstractDocumentTask { + private static final Logger LOG = LogManager.getLogger(TagesschauEntriesTask.class); + + private static final Pattern PATTERN_VIDEO = Pattern.compile("/video-\\d+\\.html$"); + private static final Pattern PATTERN_SUB_PAGE = Pattern.compile("/(tsvorzwanzigjahren(?:-ts)?-?\\d+)\\.html$"); + private static final String[] BLACKLIST = new String[] {TagesschauConstants.ARCHIVE_START_URL}; + + public TagesschauEntriesTask(final AbstractCrawler crawler, final Queue queue) { + super(crawler, queue); + } + + @Override + protected void processDocument(CrawlerUrlDTO aUrlDTO, Document aDocument) { + EntryUrlDto result = new EntryUrlDto(); + LOG.debug("Processing Tagesschau overview page: {}", aUrlDTO.getUrl()); + + final Elements links = aDocument.select(".teaser-absatz__link"); + + for (final Element link : links) { + try { + final String href = link.attr("href"); + if (href.isEmpty()) { + continue; + } + // normalize to absolute + final String fullUrl = href.startsWith("http") ? href : buildUrl(href); + + if (Arrays.stream(BLACKLIST).noneMatch(fullUrl::equalsIgnoreCase)) { + final Matcher matcherSubPage = PATTERN_SUB_PAGE.matcher(fullUrl); + final Matcher matcherVideo = PATTERN_VIDEO.matcher(fullUrl); + if (matcherSubPage.find()) { + result.addSubPage(new CrawlerUrlDTO(fullUrl)); + } else if (matcherVideo.find()) { + result.addVideo(new CrawlerUrlDTO(fullUrl)); + } + } + } catch (final Exception e) { + LOG.error("Error while processing overview link", e); + } + } + + taskResults.add(result); + } + + private static @NonNull String buildUrl(String href) { + return "https://www.tagesschau.de" + (href.startsWith("/") ? "" : "/") + href; + } + + @Override + protected AbstractRecursiveConverterTask createNewOwnInstance( + Queue aElementsToProcess) { + return new TagesschauEntriesTask(crawler, aElementsToProcess); + } +} diff --git a/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTask.java b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTask.java new file mode 100644 index 000000000..f943d90b6 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTask.java @@ -0,0 +1,57 @@ +package de.mediathekview.mserver.crawler.tagesschau.tasks; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import de.mediathekview.mserver.crawler.basic.AbstractCrawler; +import de.mediathekview.mserver.crawler.basic.AbstractDocumentTask; +import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.crawler.tagesschau.json.TagesschauVideoDeserializer; +import de.mediathekview.mserver.daten.Film; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Queue; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jsoup.nodes.Document; + +public class TagesschauVideoTask extends AbstractDocumentTask { + private static final String DESCRIPTOR_MEDIA_PLAYER = "div[data-v-type=MediaPlayer]"; + private static final Logger LOG = LogManager.getLogger(TagesschauVideoTask.class); + + private static final Type FILM_TYPE_TOKEN = new TypeToken>() {}.getType(); + + public TagesschauVideoTask(AbstractCrawler crawler, Queue queue) { + super(crawler, queue); + } + + @Override + protected void processDocument(CrawlerUrlDTO aUrlDTO, Document aDocument) { + final Gson gson = + new GsonBuilder() + .registerTypeAdapter(FILM_TYPE_TOKEN, new TagesschauVideoDeserializer(crawler)) + .create(); + + aDocument + .select(DESCRIPTOR_MEDIA_PLAYER) + .forEach( + element -> { + try { + String json = element.attr("data-v"); + final List films = gson.fromJson(json, FILM_TYPE_TOKEN); + taskResults.addAll(films); + crawler.incrementAndGetActualCount(); + } catch (Exception e) { + LOG.error(e); + crawler.incrementAndGetErrorCount(); + } + }); + } + + @Override + protected AbstractRecursiveConverterTask createNewOwnInstance( + Queue aElementsToProcess) { + return new TagesschauVideoTask(crawler, aElementsToProcess); + } +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializerTest.java new file mode 100644 index 000000000..44795eeb3 --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/json/TagesschauVideoDeserializerTest.java @@ -0,0 +1,70 @@ +package de.mediathekview.mserver.crawler.tagesschau.json; + +import static org.junit.jupiter.api.Assertions.*; + +import com.google.gson.JsonElement; +import de.mediathekview.mserver.base.config.MServerConfigManager; +import de.mediathekview.mserver.base.messages.listener.MessageListener; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauCrawler; +import de.mediathekview.mserver.daten.Film; +import de.mediathekview.mserver.daten.GeoLocations; +import de.mediathekview.mserver.daten.Sender; +import de.mediathekview.mserver.progress.listeners.SenderProgressListener; +import de.mediathekview.mserver.testhelper.AssertFilm; +import de.mediathekview.mserver.testhelper.JsonFileReader; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ForkJoinPool; + +import org.junit.jupiter.api.Test; + +class TagesschauVideoDeserializerTest { + protected MServerConfigManager rootConfig = new MServerConfigManager("MServer-JUnit-Config.yaml"); + + @Test + void test() { + + final JsonElement jsonElement = + JsonFileReader.readJson("/tagesschau/tagesschau_20jahre_video.json"); + TagesschauVideoDeserializer target = new TagesschauVideoDeserializer(createCrawler()); + final List actual = target.deserialize(jsonElement, null, null); + assertNotNull(actual); + assertEquals(1, actual.size()); + AssertFilm.assertEquals( + actual.getFirst(), + Sender.TAGESSCHAU24, + "tagesschau vor 20 Jahren", + "tagesschau vor 20 Jahren, 30. Januar 2006", + LocalDateTime.of(2006, 1, 30, 20, 0, 0), + Duration.ofSeconds(937), + "", + "https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + new GeoLocations[] {GeoLocations.GEO_NONE}, + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webm.h264.mp4", + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webl.h264.mp4", + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxl.h264.mp4", + ""); + } + + @Test + void testWrongYear() { + + final JsonElement jsonElement = + JsonFileReader.readJson("/tagesschau/tagesschau_20jahre_video_date.json"); + TagesschauVideoDeserializer target = new TagesschauVideoDeserializer(createCrawler()); + final List actual = target.deserialize(jsonElement, null, null); + assertNotNull(actual); + assertEquals(1, actual.size()); + assertEquals(LocalDateTime.of(1996, 7, 23, 22, 45, 0), actual.getFirst().getTime()); +} + protected TagesschauCrawler createCrawler() { + final ForkJoinPool forkJoinPool = new ForkJoinPool(); + final Collection nachrichten = new ArrayList<>(); + final Collection fortschritte = new ArrayList<>(); + + return new TagesschauCrawler(forkJoinPool, nachrichten, fortschritte, rootConfig); + } +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTaskTest.java new file mode 100644 index 000000000..51690e011 --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauEntriesTaskTest.java @@ -0,0 +1,129 @@ +package de.mediathekview.mserver.crawler.tagesschau.tasks; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import de.mediathekview.mserver.base.webaccess.JsoupConnection; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.crawler.tagesschau.EntryUrlDto; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauCrawler; +import de.mediathekview.mserver.testhelper.JsoupMock; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class TagesschauEntriesTaskTest extends TagesschauTaskTestBase { + + @Mock JsoupConnection jsoupConnection; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testMonth() { + final String requestUrl = "http://tagesschau-month.de"; + final CrawlerUrlDTO[] expectedUrls = + new CrawlerUrlDTO[] { + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547694.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547682.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547680.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547676.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1539874.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1539872.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1539870.html") + }; + + jsoupConnection = + JsoupMock.mock( + requestUrl, "/tagesschau/tagesschau_20jahre_month.html"); + final Set actual = executeTask(requestUrl); + assertThat(actual.size(), equalTo(1)); + final EntryUrlDto actualEntry = actual.iterator().next(); + assertThat(actualEntry.getSubPages().size(), equalTo(0)); + assertThat(actualEntry.getVideos().size(), equalTo(expectedUrls.length)); + assertThat(actualEntry.getVideos(), Matchers.containsInAnyOrder(expectedUrls)); + } + + + @Test + void testYear() { + final String requestUrl = "http://tagesschau-year.de"; + final CrawlerUrlDTO[] expectedUrls = + new CrawlerUrlDTO[] { + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-476.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-474.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-468.html") + }; + + jsoupConnection = + JsoupMock.mock( + requestUrl, "/tagesschau/tagesschau_20jahre_year.html"); + + final Set actual = executeTask(requestUrl); + assertThat(actual.size(), equalTo(1)); + final EntryUrlDto actualEntry = actual.iterator().next(); + assertThat(actualEntry.getSubPages().size(), equalTo(expectedUrls.length)); + assertThat(actualEntry.getVideos().size(), equalTo(0)); + assertThat(actualEntry.getSubPages(), Matchers.containsInAnyOrder(expectedUrls)); + } + + @Test + void testOverview() { + final String requestUrl = "http://tagesschau-overview.de"; + final CrawlerUrlDTO[] expectedUrls = + new CrawlerUrlDTO[] { + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-478.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-472.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-442.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-416.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/multimedia/tsvorzwanzigjahren-387.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-359.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-327.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-301.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-257.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-221.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-183.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-147.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-121.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-136.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-116.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-100.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-106.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-104.html"), + new CrawlerUrlDTO("https://www.tagesschau.de/inland/tsvorzwanzigjahren-ts-102.html") + }; + + jsoupConnection = + JsoupMock.mock( + requestUrl, "/tagesschau/tagesschau_20jahre_overview.html"); + + final Set actual = executeTask(requestUrl); + assertThat(actual.size(), equalTo(1)); + final EntryUrlDto actualEntry = actual.iterator().next(); + assertThat(actualEntry.getSubPages().size(), equalTo(expectedUrls.length)); + assertThat(actualEntry.getVideos().size(), equalTo(0)); + assertThat(actualEntry.getSubPages(), Matchers.containsInAnyOrder(expectedUrls)); + } + + private Set executeTask(String requestUrl) { + final TagesschauCrawler crawler = createCrawler(); + crawler.setConnection(jsoupConnection); + + final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + queue.add(new CrawlerUrlDTO(requestUrl)); + + final TagesschauEntriesTask target = new TagesschauEntriesTask(crawler, queue); + return target.invoke(); + } + +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauTaskTestBase.java b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauTaskTestBase.java new file mode 100644 index 000000000..06fce0b29 --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauTaskTestBase.java @@ -0,0 +1,22 @@ +package de.mediathekview.mserver.crawler.tagesschau.tasks; + +import de.mediathekview.mserver.base.config.MServerConfigManager; +import de.mediathekview.mserver.base.messages.listener.MessageListener; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauCrawler; +import de.mediathekview.mserver.progress.listeners.SenderProgressListener; +import de.mediathekview.mserver.testhelper.WireMockTestBase; +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ForkJoinPool; + +public class TagesschauTaskTestBase extends WireMockTestBase { + + protected MServerConfigManager rootConfig = new MServerConfigManager("MServer-JUnit-Config.yaml"); + + protected TagesschauCrawler createCrawler() { + final ForkJoinPool forkJoinPool = new ForkJoinPool(); + final Collection nachrichten = new ArrayList<>(); + final Collection fortschritte = new ArrayList<>(); + return new TagesschauCrawler(forkJoinPool, nachrichten, fortschritte, rootConfig); + } +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTaskTest.java new file mode 100644 index 000000000..4991b784e --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/tagesschau/tasks/TagesschauVideoTaskTest.java @@ -0,0 +1,63 @@ +package de.mediathekview.mserver.crawler.tagesschau.tasks; + +import static org.junit.jupiter.api.Assertions.*; + +import de.mediathekview.mserver.base.webaccess.JsoupConnection; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.crawler.tagesschau.TagesschauCrawler; +import de.mediathekview.mserver.daten.Film; +import de.mediathekview.mserver.daten.GeoLocations; +import de.mediathekview.mserver.daten.Sender; +import de.mediathekview.mserver.testhelper.AssertFilm; +import de.mediathekview.mserver.testhelper.JsoupMock; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class TagesschauVideoTaskTest extends TagesschauTaskTestBase { + + @Mock JsoupConnection jsoupConnection; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testVideo() { + final String requestUrl = "http://tagesschau-month.de"; + + jsoupConnection = JsoupMock.mock(requestUrl, "/tagesschau/tagesschau_20jahre_video.html"); + final TagesschauCrawler crawler = createCrawler(); + crawler.setConnection(jsoupConnection); + + final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + queue.add(new CrawlerUrlDTO(requestUrl)); + + final TagesschauVideoTask target = new TagesschauVideoTask(crawler, queue); + final Set actual = target.invoke(); + assertEquals(1, actual.size()); + AssertFilm.assertEquals( + actual.iterator().next(), + Sender.TAGESSCHAU24, + "tagesschau vor 20 Jahren", + "tagesschau vor 20 Jahren, 30. Januar 2006", + LocalDateTime.of(2006, 1, 30, 20, 0, 0), + Duration.ofMinutes(15).plusSeconds(37), + "", + "https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + new GeoLocations[] {GeoLocations.GEO_NONE}, + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webm.h264.mp4", + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webl.h264.mp4", + "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxl.h264.mp4", + ""); + } +} diff --git a/src/test/java/de/mediathekview/mserver/testhelper/JsoupMock.java b/src/test/java/de/mediathekview/mserver/testhelper/JsoupMock.java index 219acb969..57e635634 100644 --- a/src/test/java/de/mediathekview/mserver/testhelper/JsoupMock.java +++ b/src/test/java/de/mediathekview/mserver/testhelper/JsoupMock.java @@ -52,9 +52,9 @@ public static JsoupConnection mockWithTextModifications( final Document document = Jsoup.parse(fileContent); final Document XmlDocument = Jsoup.parse(fileContent, url, Parser.xmlParser()); - Mockito.when(connection.requestBodyAsString(url)).thenReturn(fileContent); + Mockito.lenient().when(connection.requestBodyAsString(url)).thenReturn(fileContent); Mockito.when(connection.requestBodyAsHtmlDocument(url)).thenReturn(document); - Mockito.when(connection.requestBodyAsXmlDocument(org.mockito.Mockito.eq(url))) + Mockito.lenient().when(connection.requestBodyAsXmlDocument(org.mockito.Mockito.eq(url))) .thenReturn(XmlDocument); } catch (final IOException ioException) { LogManager.getLogger(JsoupMock.class) diff --git a/src/test/java/de/mediathekview/mserver/testhelper/WireMockTestBase.java b/src/test/java/de/mediathekview/mserver/testhelper/WireMockTestBase.java index 4c9b4d7b5..4246d430c 100644 --- a/src/test/java/de/mediathekview/mserver/testhelper/WireMockTestBase.java +++ b/src/test/java/de/mediathekview/mserver/testhelper/WireMockTestBase.java @@ -9,6 +9,9 @@ import org.junit.Before; import jakarta.annotation.Nullable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + import java.util.Optional; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -18,11 +21,12 @@ /** base class of tests with WireMock. */ public abstract class WireMockTestBase { - private final Logger LOG = LogManager.getLogger(WireMockTestBase.class); + private static final Logger LOG = LogManager.getLogger(WireMockTestBase.class); protected WireMockServer wireMockServer = new WireMockServer(options().dynamicPort()); private boolean wireMockStarted = false; @Before + @BeforeEach public void setUpClass() { LOG.info("Setting up WireMock test class"); startWireMock(); @@ -39,6 +43,7 @@ protected synchronized void startWireMock() { } @After + @AfterEach public void tearDownClass() { LOG.info("Tear down WireMock test class"); LOG.info("Stopping WireMock"); diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_month.html b/src/test/resources/tagesschau/tagesschau_20jahre_month.html new file mode 100644 index 000000000..3373acd74 --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_month.html @@ -0,0 +1,6080 @@ + + + + + + + + + + + + + + + + + + + tagesschau vor 20 Jahren - der Januar 2006 | tagesschau.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + +
+
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + +
+ + + + + +
+ + + + + + +
+ + + + + + + + + + tagesschau-Logo 1997 - 2005 + +
+ +
+ + + +
+ + + +
+ +

+ Video-Rückblick + Januar 2006 +

+

Stand: 31.01.2026 • 06:03 Uhr

+
+ + + + + + + + + + +

+ Die tagesschau vor 20 Jahren - alle Ausgaben aus dem Januar 2006 +

+ + + + + +
+
+ + + + + + + + + + + + + + + + +

tagesschau.de dokumentiert das Jahr 2006 Tag für Tag mit den 20-Uhr-Ausgaben der Tagesschau.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + + + + + + + + + +
+ +
+ + + + +
+
+
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_overview.html b/src/test/resources/tagesschau/tagesschau_20jahre_overview.html new file mode 100644 index 000000000..9c1b94334 --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_overview.html @@ -0,0 +1,7356 @@ + + + + + + + + + + + + + + + + + + + Zeitgeschichte: Die tagesschau vor 20 Jahren | tagesschau.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + +
+
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + +
+ + + + + +
+ + + + + + +
+ + + + + + + + + + tagesschau-Logo 1997 - 2005 + +
+ +
+ + + +
+ + + +
+ +

+ Zeitgeschichte + tagesschau vor 20 Jahren +

+

Stand: 24.04.2026 • 06:52 Uhr

+
+ + + + + + + + + + +

+ tagesschau vor 20 Jahren: Wie sah die Welt vor 20 Jahren aus? Alle 20-Uhr-Sendungen der tagesschau seit 1989 im Nachrichtenrückblick. +

+ + + + + +
+
+ + + + + + + + + + + + + + + + +

Wie sah die Welt vor 20 Jahren aus? Welche Themen bestimmten die politische Debatte? Wie wurden die Probleme bewertet? Wer war damals wichtig? Die tagesschau bietet einen wertvollen Einblick in die jüngere Zeitgeschichte.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Die tagesschau vor 20 Jahren dokumentiert alle 20-Uhr-Ausgaben Tag für Tag im Nachrichtenrückblick.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Tagesschau-Ausgaben im April 2006

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Die Jahre 1989-2006

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + + + + + + + + + +
+ +
+ + + + +
+
+
+ + + + + + + + +
+ +
s + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_video.html b/src/test/resources/tagesschau/tagesschau_20jahre_video.html new file mode 100644 index 000000000..7db1ec2dc --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_video.html @@ -0,0 +1,5288 @@ + + + + + + + + + + + + + + + + + + + tagesschau vor 20 Jahren, 30. Januar 2006 | tagesschau.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + +
+
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+
+
+ +
+ +
+ + + +
+
+ + Sendung + +
+

+ + tagesschau vor 20 Jahren, 30. Januar 2006 +

+
Stand: 22.01.2026 • 13:38 Uhr
+
+

tagesschau vor 20 Jahren, 30. Januar 2006

+
+
+ +
+ + + + + +
+ + + + + + + + + + Sendungsbild + +
+ + + + + + + + + +
+
+ + + + +
+
+ tagesschau vor 20 Jahren, Das Erste, 30.01.2006 • 20:00 Uhr +
+
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + +
+
+
+ + + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_video.json b/src/test/resources/tagesschau/tagesschau_20jahre_video.json new file mode 100644 index 000000000..554520562 --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_video.json @@ -0,0 +1,248 @@ +{ + "pc" : { + "web" : { + "baseUrl" : "/resources/assets/js/vendor/ardplayer/", + "isForcedAutoPlay" : false, + "isEnablePostMessage" : false, + "isForcedVideoView" : true, + "disableBackButtonTitle" : true, + "disablePosterTitle" : true, + "disablePosterImage" : true + }, + "generic" : { + "imageTemplateConfig" : { + "size" : [ { + "minWidth" : 0, + "value" : "AAABnSSvsdE/16x9-small" + }, { + "minWidth" : 568, + "value" : "AAABnSSvrFg/16x9-big" + } ], + "width" : { + "min" : 320, + "max" : 1920, + "stepSize" : 320 + } + }, + "isAutoplay" : false + }, + "pluginData" : { } + }, + "mc" : { + "streams" : [ { + "media" : [ { + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webs.h264.mp4", + "mimeType" : "video/mp4", + "fallbackGroup" : 9, + "maxHResolutionPx" : 480, + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ] + }, { + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webm.h264.mp4", + "mimeType" : "video/mp4", + "fallbackGroup" : 6, + "maxHResolutionPx" : 640, + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ] + }, { + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webl.h264.mp4", + "mimeType" : "video/mp4", + "fallbackGroup" : 4, + "maxHResolutionPx" : 960, + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ] + }, { + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxl.h264.mp4", + "mimeType" : "video/mp4", + "fallbackGroup" : 2, + "maxHResolutionPx" : 1280, + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ] + }, { + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxxl.h264.mp4", + "mimeType" : "video/mp4", + "fallbackGroup" : 1, + "maxHResolutionPx" : 1920, + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ] + }, { + "url" : "https://adaptive.tagesschau.de/i/video/2026/0122/TV-20260122-1304-0500,.webs.h264.mp4,.webl.h264.mp4,.webxl.h264.mp4,.webxxl.h264.mp4,.webm.h264.mp4,.csmil/master.m3u8", + "mimeType" : "application/vnd.apple.mpegurl", + "audios" : [ { + "kind" : "standard", + "languageCode" : "de" + } ], + "isAdaptiveQualitySelectable" : true + } ], + "kind" : "main", + "isAudioOnly" : false + } ], + "meta" : { + "images" : [ { + "url" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/{size}/sendungsbild-1674792.webp?width={width}", + "kind" : "preview", + "title" : "Sendungsbild | ARD-aktuell", + "alt" : "Sendungsbild" + }, { + "url" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/{size}/sendungsbild-1674792.jpg?width={width}", + "kind" : "preview", + "title" : "Sendungsbild | ARD-aktuell", + "alt" : "Sendungsbild" + } ], + "title" : "tagesschau vor 20 Jahren, 30. Januar 2006", + "seriesTitle" : "tagesschau vor 20 Jahren", + "durationSeconds" : 937, + "broadcastedOnDateTime" : "2006-01-30T19:00:00+0000", + "showBroadcastedOnWithTime" : true, + "synopsis" : "tagesschau vor 20 Jahren, 30. Januar 2006" + }, + "pluginData" : { + "sharing@web" : { + "link" : "https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + "body" : "Meine Empfehlung: „tagesschau vor 20 Jahren, 30. Januar 2006” \nhttps://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + "subject" : "Entdeckt auf tagesschau.de: tagesschau vor 20 Jahren, 30. Januar 2006", + "disableSubclipping" : true, + "services" : [ "url", "email", "whatsapp", "facebook", "fb-messenger", "twitter", "telegram", "threema", "embed" ], + "embedCode" : "", + "params" : "?startTime=$start$&endTime=$ende$", + "legal" : "Durch die Einbettung von ARD-Videos auf Ihrer Webseite stimmen Sie den ARD Nutzungsbedingungen zu.", + "embedDialogTitle" : "Inhalt einbetten" + }, + "download@web" : { + "isEnabled" : true, + "sources" : [ { + "title" : "SD 270p", + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webs.h264.mp4?download=true" + }, { + "title" : "SD 360p", + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webm.h264.mp4?download=true" + }, { + "title" : "SD 540p", + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webl.h264.mp4?download=true" + }, { + "title" : "HD 720p", + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxl.h264.mp4?download=true" + }, { + "title" : "HD 1080p", + "url" : "https://tagesschau-progressive.ard-mcdn.de/video/2026/0122/TV-20260122-1304-0500.webxxl.h264.mp4?download=true" + }, { + "title" : "SD 540p", + "url" : "https://tagesschau-podcast.ard-mcdn.de/audio/2026/0122/TV-20260122-1304-0500.mp3?download=true" + } ] + }, + "trackingPiano@all" : { + "config" : { + "dimensionTransform" : { + "av_autoplay" : "av_auto_mode" + }, + "events" : [ "av.speed", "av.quality", "av.error", "av.volume", "av.volume.mute", "av.share", "av.dialog.open", "av.dialog.close", "av.playermode", "av.jumpmark", "av.subtitle", "av.language", "av.audiodescription", "av.signlanguage", "av.set.sleeptimer", "av.playlist", "av.embed.click", "av.embed.title", "av.recommendation" ] + }, + "avContent" : { + "atiTagConfig" : { + "site" : 595936, + "collectDomain" : "vqggwrz.pa-cd.com", + "addEventURL" : "true" + }, + "s:tgp_page_chapter1" : "multimedia", + "s:tgp_page_chapter2" : "sendung", + "s:tgp_page_chapter3" : "tagesschau_vor_20_jahren", + "s:technical_tagging_guide" : "Unified", + "s:site_level2" : "www.tagesschau.de", + "s:tgp_product_platform" : "Web", + "b:product_login" : true, + "content_authors" : [ "tagesschau" ], + "s:page" : "tagesschau vor 20 Jahren, 30. Januar 2006", + "b:tgp_page_contains_video" : true, + "b:tgp_page_contains_audio" : false, + "s:tgp_content_object_type" : "Video", + "d:tgp_content_publication_time" : "2026-01-22T13:38:44Z", + "s:tgp_content_external_id" : "7539dc1b-9778-44f8-b93b-44f16ee02bb7", + "s:tgp_content_id" : "video-1547686", + "s:tgp_content_content_type" : "Sendung", + "d:tgp_content_last_editorial_update" : "2026-01-22T13:38:44Z", + "a:s:tgp_content_keywords" : [ "Tagesschau vor 20 Jahren" ], + "s:tgp_content_creator" : "tagesschau", + "s:tgp_content_creator_institution" : "tagesschau", + "s:tgp_content_broadcast_station" : "Das Erste", + "d:tgp_content_online_since" : "2026-01-22T13:38:44Z", + "s:tgp_content_show" : "tagesschau vor 20 Jahren", + "s:tgp_content_show_id" : "tsv20", + "b:tgp_content_broadcast_reference" : true, + "n:tgp_content_days_since_publication" : 94, + "n:tgp_content_days_since_online" : 94, + "a:s:tgp_content_external_tags" : [ "Tagesschau vor 20 Jahren" ], + "s:tgp_content_teaser_image_url" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/AAABnR8VW9w/original/sendungsbild-1674792.jpg", + "s:tgp_content_url_path" : "/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + "b:tgp_content_author_visible" : false, + "n:av_content_duration" : 937000, + "s:av_content" : "tagesschau vor 20 Jahren, 30. Januar 2006", + "av_content_id" : "video-1547686", + "s:av_show" : "tagesschau vor 20 Jahren", + "s:av_content_type" : "Video", + "s:av_broadcasting_type" : "OnDemand", + "d:av_original_air_time" : "2006-01-30T20:00:00Z", + "b:av_web_only" : false, + "b:av_full_show" : true, + "s:av_player" : "ARD Player", + "s:av_content_creator" : "tagesschau", + "s:av_content_external_id" : "7539dc1b-9778-44f8-b93b-44f16ee02bb7", + "s:av_institution" : "tagesschau", + "s:av_publisher" : "Das Erste", + "s:av_show_id" : "tsv20", + "s:av_content_url" : "https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + "d:av_online_since" : "2026-01-22T13:38:44Z", + "d:av_publication_time" : "2026-01-22T13:38:44Z" + }, + "isEnabled" : true + }, + "trackingAgf@all" : { + "appId" : "PE6FF1BB7-FE88-4674-B083-2772ADAD55E9", + "playerID" : "video-1547686", + "clipData" : { + "type" : "content", + "assetid" : "video-1547686_0", + "program" : "tagesschau vor 20 Jahren", + "length" : "937", + "title" : "Das Erste_tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 30. Januar 2006_2026.01.22 13:38:44", + "nol_c0" : "p0,0", + "nol_c2" : "p2,N", + "nol_c5" : "p5,https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-1547686.html", + "nol_c7" : "p7,video-1547686", + "nol_c9" : "p9,tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 30. Januar 2006_2026.01.22 13:38:44", + "nol_c10" : "p10,Das Erste", + "nol_c12" : "p12,Content", + "nol_c16" : "p16,ARD_Information", + "nol_c18" : "p18,N" + }, + "sfcode" : "eu", + "prod" : "vc", + "apn" : "ardplayer", + "agfMetaDataSDK" : { + "censuscategory" : "Das Erste_tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 30. Januar 2006_2026.01.22 13:38:44", + "livestream" : "no" + } + } + } + }, + "mediadescription" : "tagesschau vor 20 Jahren, 30. Januar 2006", + "playerType" : "video", + "ratio" : "16x9", + "context" : "avdetail", + "posterImage" : { + "altText" : "Sendungsbild", + "title" : "Sendungsbild | ARD-aktuell", + "urlS" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/AAABnSSvrFg/16x9-big/sendungsbild-1674792.webp?width=640", + "urlM" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/AAABnSSvrFg/16x9-big/sendungsbild-1674792.webp?width=768", + "urlL" : "https://images.tagesschau.de/image/e4798de6-ff1d-49ed-827e-334b743c6961/AAABm-W2WN8/AAABnSSvrFg/16x9-big/sendungsbild-1674792.webp?width=1280" + } +} \ No newline at end of file diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_video_date.json b/src/test/resources/tagesschau/tagesschau_20jahre_video_date.json new file mode 100644 index 000000000..81a940463 --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_video_date.json @@ -0,0 +1,371 @@ +{ + "pc":{ + "web":{ + "baseUrl":"/resources/assets/js/vendor/ardplayer/", + "isForcedAutoPlay":false, + "isEnablePostMessage":false, + "isForcedVideoView":true, + "disableBackButtonTitle":true, + "disablePosterTitle":true, + "disablePosterImage":true + }, + "generic":{ + "imageTemplateConfig":{ + "size":[ + { + "minWidth":0, + "value":"AAABnSSvsdE/16x9-small" + }, + { + "minWidth":568, + "value":"AAABnSSvrFg/16x9-big" + } + ], + "width":{ + "min":320, + "max":1920, + "stepSize":320 + } + }, + "isAutoplay":false + }, + "pluginData":{ + + } + }, + "mc":{ + "streams":[ + { + "media":[ + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webl.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":4, + "maxHResolutionPx":960, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webs.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":9, + "maxHResolutionPx":480, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.websm.h264.mp4", + "mimeType":"video/mp4", + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webm.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":6, + "maxHResolutionPx":640, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webml.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":8, + "maxHResolutionPx":512, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.weblp.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":4, + "maxHResolutionPx":960, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webxl.h264.mp4", + "mimeType":"video/mp4", + "fallbackGroup":2, + "maxHResolutionPx":1280, + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webm.webm", + "mimeType":"video/mp4", + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webl.webm", + "mimeType":"video/mp4", + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.h264.mp4", + "mimeType":"video/mp4", + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ] + }, + { + "url":"https://adaptive.tagesschau.de/i/video/2016/0721/TV-20160721-1203-0101,.h264.mp4,.webml.h264.mp4,.weblp.h264.mp4,.webs.h264.mp4,.webl.h264.mp4,.webxl.h264.mp4,.webm.h264.mp4,.csmil/master.m3u8", + "mimeType":"application/vnd.apple.mpegurl", + "audios":[ + { + "kind":"standard", + "languageCode":"de" + } + ], + "isAdaptiveQualitySelectable":true + } + ], + "kind":"main", + "isAudioOnly":false + } + ], + "meta":{ + "images":[ + { + "url":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/{size}/sendungsbild-186911.webp?width={width}", + "kind":"preview", + "title":"Sendungsbild | ARD-aktuell", + "alt":"Sendungsbild" + }, + { + "url":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/{size}/sendungsbild-186911.jpg?width={width}", + "kind":"preview", + "title":"Sendungsbild | ARD-aktuell", + "alt":"Sendungsbild" + } + ], + "title":"tagesschau vor 20 Jahren, 23 Juli 1996", + "seriesTitle":"tagesschau vor 20 Jahren", + "durationSeconds":944, + "broadcastedOnDateTime":"2016-07-23T20:45:00+0000", + "showBroadcastedOnWithTime":true, + "synopsis":"23 Juli 1996" + }, + "pluginData":{ + "sharing@web":{ + "link":"https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-201449.html", + "body":"Meine Empfehlung: „tagesschau vor 20 Jahren, 23 Juli 1996” \nhttps://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-201449.html", + "subject":"Entdeckt auf tagesschau.de: tagesschau vor 20 Jahren, 23 Juli 1996", + "disableSubclipping":true, + "services":[ + "url", + "email", + "whatsapp", + "facebook", + "fb-messenger", + "twitter", + "telegram", + "threema", + "embed" + ], + "embedCode":"<iframe src=\"https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-201449~player.html$params$\" width=\"512\" height=\"288\" allowfullscreen frameBorder=\"0\" scrolling=\"no\"></iframe>", + "params":"?startTime=$start$&endTime=$ende$", + "legal":"Durch die Einbettung von ARD-Videos auf Ihrer Webseite stimmen Sie den <a href=\"https://www.ardmediathek.de/ard/nutzungsbedingungen\" target=\"_blank\">ARD Nutzungsbedingungen</a> zu.", + "embedDialogTitle":"Inhalt einbetten" + }, + "download@web":{ + "isEnabled":true, + "sources":[ + { + "title":"SD 540p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webl.h264.mp4?download=true" + }, + { + "title":"SD 270p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webs.h264.mp4?download=true" + }, + { + "title":"SD 360p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webm.h264.mp4?download=true" + }, + { + "title":"SD 360p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webml.h264.mp4?download=true" + }, + { + "title":"SD 540p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.weblp.h264.mp4?download=true" + }, + { + "title":"HD 720p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.webxl.h264.mp4?download=true" + }, + { + "title":"SD 540p", + "url":"https://tagesschau-progressive.ard-mcdn.de/video/2016/0721/TV-20160721-1203-0101.h264.mp4?download=true" + }, + { + "title":"SD 540p", + "url":"https://tagesschau-podcast.ard-mcdn.de/audio/2016/0721/TV-20160721-1203-0101.mp3?download=true" + } + ] + }, + "trackingPiano@all":{ + "config":{ + "dimensionTransform":{ + "av_autoplay":"av_auto_mode" + }, + "events":[ + "av.speed", + "av.quality", + "av.error", + "av.volume", + "av.volume.mute", + "av.share", + "av.dialog.open", + "av.dialog.close", + "av.playermode", + "av.jumpmark", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.set.sleeptimer", + "av.playlist", + "av.embed.click", + "av.embed.title", + "av.recommendation" + ] + }, + "avContent":{ + "atiTagConfig":{ + "site":595936, + "collectDomain":"vqggwrz.pa-cd.com", + "addEventURL":"true" + }, + "s:tgp_page_chapter1":"multimedia", + "s:tgp_page_chapter2":"sendung", + "s:tgp_page_chapter3":"tagesschau_vor_20_jahren", + "s:technical_tagging_guide":"Unified", + "s:site_level2":"www.tagesschau.de", + "s:tgp_product_platform":"Web", + "b:product_login":true, + "content_authors":[ + "tagesschau" + ], + "s:page":"tagesschau vor 20 Jahren, 23 Juli 1996", + "b:tgp_page_contains_video":true, + "b:tgp_page_contains_audio":false, + "s:tgp_content_object_type":"Video", + "d:tgp_content_publication_time":"1996-07-23T20:00:00Z", + "s:tgp_content_external_id":"tagesschau_TV-20160721-1203-0101", + "s:tgp_content_id":"video-201449", + "d:tgp_content_last_editorial_update":"1996-07-23T20:00:00Z", + "s:tgp_content_creator":"tagesschau", + "s:tgp_content_creator_institution":"tagesschau", + "s:tgp_content_broadcast_station":"Das Erste", + "s:tgp_content_show":"tagesschau vor 20 Jahren", + "s:tgp_content_show_id":"tsv20", + "b:tgp_content_broadcast_reference":true, + "n:tgp_content_days_since_publication":10888, + "s:tgp_content_teaser_image_url":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/AAABnR8VW9w/original/sendungsbild-186911.jpg", + "s:tgp_content_url_path":"/multimedia/sendung/tagesschau_vor_20_jahren/video-201449.html", + "b:tgp_content_author_visible":false, + "n:av_content_duration":944000, + "s:av_content":"tagesschau vor 20 Jahren, 23 Juli 1996", + "av_content_id":"video-201449", + "s:av_show":"tagesschau vor 20 Jahren", + "s:av_content_type":"Video", + "s:av_broadcasting_type":"OnDemand", + "d:av_original_air_time":"2016-07-23T22:45:00Z", + "b:av_web_only":true, + "b:av_full_show":false, + "s:av_player":"ARD Player", + "s:av_content_creator":"tagesschau", + "s:av_content_external_id":"tagesschau_TV-20160721-1203-0101", + "s:av_content_crid":"crid://tagesschau.de/tagesschau_TV-20160721-1203-0101", + "s:av_institution":"tagesschau", + "s:av_publisher":"Das Erste", + "s:av_show_id":"tsv20", + "s:av_content_url":"https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-201449.html", + "d:av_publication_time":"1996-07-23T20:00:00Z" + }, + "isEnabled":true + }, + "trackingAgf@all":{ + "appId":"PE6FF1BB7-FE88-4674-B083-2772ADAD55E9", + "playerID":"video-201449", + "clipData":{ + "type":"content", + "assetid":"video-201449_0", + "program":"tagesschau vor 20 Jahren", + "length":"944", + "title":"Das Erste_tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 23 Juli 1996_1996.07.23 20:00:00", + "nol_c0":"p0,0", + "nol_c2":"p2,N", + "nol_c5":"p5,https://www.tagesschau.de/multimedia/sendung/tagesschau_vor_20_jahren/video-201449.html", + "nol_c7":"p7,video-201449", + "nol_c9":"p9,tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 23 Juli 1996_1996.07.23 20:00:00", + "nol_c10":"p10,Das Erste", + "nol_c12":"p12,Content", + "nol_c16":"p16,ARD_Information", + "nol_c18":"p18,N" + }, + "sfcode":"eu", + "prod":"vc", + "apn":"ardplayer", + "agfMetaDataSDK":{ + "censuscategory":"Das Erste_tagesschau vor 20 Jahren_tagesschau vor 20 Jahren, 23 Juli 1996_1996.07.23 20:00:00", + "livestream":"no" + } + } + } + }, + "mediadescription":"tagesschau vor 20 Jahren, 23 Juli 1996", + "playerType":"video", + "ratio":"16x9", + "context":"avdetail", + "posterImage":{ + "altText":"Sendungsbild", + "title":"Sendungsbild | ARD-aktuell", + "urlS":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/AAABnSSvrFg/16x9-big/sendungsbild-186911.webp?width=640", + "urlM":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/AAABnSSvrFg/16x9-big/sendungsbild-186911.webp?width=768", + "urlL":"https://images.tagesschau.de/image/72ef28e9-ed07-436b-a2cf-101df86a10b2/AAABliKBGks/AAABnSSvrFg/16x9-big/sendungsbild-186911.webp?width=1280" + } +} \ No newline at end of file diff --git a/src/test/resources/tagesschau/tagesschau_20jahre_year.html b/src/test/resources/tagesschau/tagesschau_20jahre_year.html new file mode 100644 index 000000000..0e51be0a7 --- /dev/null +++ b/src/test/resources/tagesschau/tagesschau_20jahre_year.html @@ -0,0 +1,6303 @@ + + + + + + + + + + + + + + + + + + + tagesschau vor 20 Jahren: 2006 | tagesschau.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + +
+
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + +
+ + + + + +
+ + + + + + +
+ + + + + + + + + + tagesschau-Logo 1997 - 2005 + +
+ +
+ + + +
+ + + +
+ +

+ Video-Rückblick + Nachrichten aus dem Jahr 2006 +

+

Stand: 01.04.2026 • 11:47 Uhr

+
+ + + + + + + + + + +

+ Nachrichten-Rückblick auf das Jahr 2006: Zeitgeschichte und historische Ereignisse - Hier können Sie sie in der tagesschau vor 20 Jahren noch einmal sehen. +

+ + + + + +
+
+ + + + + + + + + + + + + + + + +

tagesschau.de dokumentiert das Jahr 2006 Tag für Tag mit den 20-Uhr-Ausgaben der Tagesschau.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + + + + + + + + + +
+ +
+ + + + +
+
+
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + + + + + + + +
+ +