From 28dc00aea603f8715a64228149e828e5700986a1 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Sun, 28 Apr 2024 12:33:32 +0200 Subject: [PATCH 01/15] ard v6 --- .../mserver/crawler/ard/ArdConstants.java | 2 +- .../crawler/ard/json/ArdFilmDeserializer.java | 211 +++++++++++++----- .../ard/json/ArdTeasersDeserializer.java | 3 +- .../crawler/ard/json/ArdVideoInfoDto.java | 17 +- .../json/ArdVideoInfoJsonDeserializer.java | 26 ++- .../crawler/sr/tasks/SrFilmDetailTask.java | 10 +- 6 files changed, 191 insertions(+), 78 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java index 941deffee..9dda8bea8 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java @@ -5,7 +5,7 @@ public class ArdConstants { public static final String API_URL = "https://api.ardmediathek.de"; public static final String BASE_URL = "https://api.ardmediathek.de/public-gateway"; - public static final String ITEM_URL = API_URL + "/page-gateway/pages/ard/item/"; + public static final String ITEM_URL = API_URL + "/page-gateway/pages/ard/item/%s?embedded=true&mcV6=true"; public static final String TOPICS_URL = API_URL + "/page-gateway/pages/%s/editorial/experiment-a-z?embedded=false"; public static final String TOPICS_COMPILATION_URL = API_URL + "/page-gateway/widgets/%s/editorials/%s?pageNumber=0&pageSize=%s"; diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index e1078dd94..b513a2342 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -7,15 +7,14 @@ import de.mediathekview.mlib.daten.Sender; import de.mediathekview.mserver.base.utils.GeoLocationGuesser; import de.mediathekview.mserver.base.utils.JsonUtils; -import de.mediathekview.mserver.base.utils.UrlUtils; import de.mediathekview.mserver.crawler.ard.ArdConstants; import de.mediathekview.mserver.crawler.ard.ArdFilmDto; import de.mediathekview.mserver.crawler.ard.ArdFilmInfoDto; import de.mediathekview.mserver.crawler.basic.AbstractCrawler; -import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import javax.annotation.Nullable; + import java.lang.reflect.Type; import java.net.MalformedURLException; import java.net.URL; @@ -39,14 +38,28 @@ public class ArdFilmDeserializer implements JsonDeserializer> { private static final String ELEMENT_SHOW = "show"; private static final String ELEMENT_TEASERS = "teasers"; private static final String ELEMENT_WIDGETS = "widgets"; + private static final String ELEMENT_SUBTITLES = "subtitles"; + private static final String ELEMENT_SOURCES = "sources"; + private static final String ELEMENT_STREAMS = "streams"; + private static final String ELEMENT_MEDIA = "media"; + private static final String ELEMENT_AUDIO = "audios"; + private static final String ATTRIBUTE_BROADCAST = "broadcastedOn"; - private static final String ATTRIBUTE_DURATION = "_duration"; + private static final String[] ATTRIBUTE_DURATION = {"meta","duration"}; + private static final String[] ATTRIBUTE_DURATION_SEC = {"meta","durationSeconds"}; private static final String ATTRIBUTE_ID = "id"; private static final String ATTRIBUTE_NAME = "name"; private static final String ATTRIBUTE_PARTNER = "partner"; private static final String ATTRIBUTE_SYNOPSIS = "synopsis"; private static final String ATTRIBUTE_TITLE = "title"; + private static final String ATTRIBUTE_URL = "url"; + private static final String ATTRIBUTE_RESOLUTION_H = "maxHResolutionPx"; + private static final String ATTRIBUTE_MIME = "mimeType"; + private static final String ATTRIBUTE_KIND = "kind"; + + + private final ArdVideoInfoJsonDeserializer videoDeserializer; private final AbstractCrawler crawler; @@ -57,19 +70,11 @@ public ArdFilmDeserializer(final AbstractCrawler crawler) { } private static Optional getMediaCollectionObject(final JsonObject itemObject) { - if (itemObject.has(ELEMENT_MEDIA_COLLECTION) - && !itemObject.get(ELEMENT_MEDIA_COLLECTION).isJsonNull() - && itemObject.getAsJsonObject(ELEMENT_MEDIA_COLLECTION).has(ELEMENT_EMBEDDED) - && !itemObject - .getAsJsonObject(ELEMENT_MEDIA_COLLECTION) - .get(ELEMENT_EMBEDDED) - .isJsonNull()) { - - return Optional.of( - itemObject.getAsJsonObject(ELEMENT_MEDIA_COLLECTION).getAsJsonObject(ELEMENT_EMBEDDED)); + Optional mc = JsonUtils.getElement(itemObject, ELEMENT_MEDIA_COLLECTION, ELEMENT_EMBEDDED); + if (mc.isEmpty()) { + return Optional.empty(); } - - return Optional.empty(); + return Optional.of(JsonUtils.getElement(itemObject, ELEMENT_MEDIA_COLLECTION, ELEMENT_EMBEDDED).get().getAsJsonObject()); } private static Optional parseTopic(final JsonObject playerPageObject) { @@ -108,16 +113,30 @@ private static Optional parseDate(final JsonObject playerPageObje private static Optional parseDuration(final JsonObject playerPageObject) { final Optional mediaCollectionObject = getMediaCollectionObject(playerPageObject); - if (mediaCollectionObject.isPresent() && mediaCollectionObject.get().has(ATTRIBUTE_DURATION)) { - final long durationValue = mediaCollectionObject.get().get(ATTRIBUTE_DURATION).getAsLong(); - return Optional.of(Duration.ofSeconds(durationValue)); + if (mediaCollectionObject.isPresent()) { + final Optional durationElement = JsonUtils.getElement(mediaCollectionObject.get(), ATTRIBUTE_DURATION); + final Optional durationElementSec = JsonUtils.getElement(mediaCollectionObject.get(), ATTRIBUTE_DURATION_SEC); + if (durationElement.isPresent()) { + return Optional.of(Duration.ofSeconds(durationElement.get().getAsLong())); + } else if (durationElementSec.isPresent()) { + return Optional.of(Duration.ofSeconds(durationElementSec.get().getAsLong())); + } } - return Optional.empty(); } - private static String prepareSubtitleUrl(final String url) { - return UrlUtils.addDomainIfMissing(url, ArdConstants.BASE_URL_SUBTITLES); + private Optional> prepareSubtitleUrl(final JsonElement embeddedElement) { + Optional subtitle = JsonUtils.getElement(embeddedElement, ELEMENT_SUBTITLES); + if (subtitle.isEmpty() || !subtitle.get().isJsonArray() || (subtitle.get().getAsJsonArray().size() == 0)) + return Optional.empty(); + Optional sources = JsonUtils.getElement(subtitle.get().getAsJsonArray().get(0), ELEMENT_SOURCES); + if (sources.isEmpty() || !sources.get().isJsonArray()) + return Optional.empty(); + Set urls = new HashSet(); + for (JsonElement url : sources.get().getAsJsonArray()) { + JsonUtils.getElementValueAsString(url, ATTRIBUTE_URL).ifPresent(urls::add); + } + return Optional.of(urls); } @Override @@ -144,23 +163,23 @@ public List deserialize( JsonUtils.getAttributeAsString(itemObject, ATTRIBUTE_SYNOPSIS); final Optional date = parseDate(itemObject); final Optional duration = parseDuration(itemObject); - final Optional videoInfo = parseVideoUrls(itemObject); - final Optional partner = parsePartner(itemObject); - + final Sender sender = determinePartner(itemObject); + final Optional videoInfoStandard = parseVideoUrls(itemObject, "standard", "video/mp4"); + final Optional videoInfoAdaptive = parseVideoUrls(itemObject, "standard", "application/vnd.apple.mpegurl"); + final Optional videoInfoAD = parseVideoUrls(itemObject, "standard", "audio-description"); + final Optional videoInfoDGS = parseVideoUrls(itemObject, "standard", "sign-language"); + // FUNK provides adaptive only + Optional videoInfo = videoInfoStandard; + if (videoInfoStandard.isEmpty() && videoInfoAD.isEmpty()) { + videoInfo = fallbackToM3U(videoInfoAdaptive); + } + + if (topic.isPresent() && title.isPresent() && videoInfo.isPresent() && videoInfo.get().getVideoUrls().size() > 0) { - - final Sender sender; - // If partner is present and an existing sender set it. Like for RBB - if (partner.isPresent()) { - final Optional additionalSender = Sender.getSenderByName(partner.get()); - sender = additionalSender.orElse(Sender.ARD); - } else { - sender = Sender.ARD; - } - + videoInfo.get().setSubtitleUrl(prepareSubtitleUrl(jsonElement)); // add film to ARD final ArdFilmDto filmDto = new ArdFilmDto( @@ -172,20 +191,75 @@ public List deserialize( date.orElse(null), duration.orElse(null), videoInfo.get())); - if (widgets.size() > 1) { - parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); - } films.add(filmDto); + // + if (topic.isPresent() + && title.isPresent() + && videoInfoAD.isPresent() + && videoInfoAD.get().getVideoUrls().size() > 0) { + videoInfoAD.get().setSubtitleUrl(prepareSubtitleUrl(jsonElement)); + // add film to ARD + final ArdFilmDto filmDtoAD = + new ArdFilmDto( + createFilm( + sender, + topic.get(), + title.get(), + description.orElse(null), + date.orElse(null), + duration.orElse(null), + videoInfo.get())); + films.add(filmDtoAD); + // + if (widgets.size() > 1) { + parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); + } + } + } else { + LOG.debug("No title, topic or video found for {} {} {} ", title, topic, sender); } return films; } + + private Optional fallbackToM3U(Optional m3u) { + // FUNK provides adaptive only + if (m3u.isPresent() && m3u.get().containsResolution(Resolution.NORMAL)) { + Map resolutionUrlMapFromM3U; + try { + resolutionUrlMapFromM3U = videoDeserializer.loadM3U8(new URL(m3u.get().getVideoUrls().get(Resolution.NORMAL))); + if (resolutionUrlMapFromM3U.size() > 0) { + ArdVideoInfoDto newVideoInfo = new ArdVideoInfoDto(); + resolutionUrlMapFromM3U.forEach((key, value) -> newVideoInfo.put(key, value.toString())); + return Optional.of(newVideoInfo); + } + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return Optional.empty(); + } private Optional parseTitle(final JsonObject playerPageObject) { final Optional title = JsonUtils.getAttributeAsString(playerPageObject, ATTRIBUTE_TITLE); return title.map(nonNullTitle -> nonNullTitle.replace("Hörfassung", "Audiodeskription")); } + + + private Sender determinePartner(JsonObject playerPageObject) { + final Optional partner = parsePartner(playerPageObject); + final Sender sender; + // If partner is present and an existing sender set it. Like for RBB + if (partner.isPresent()) { + final Optional additionalSender = Sender.getSenderByName(partner.get()); + sender = additionalSender.orElse(Sender.ARD); + } else { + sender = Sender.ARD; + } + return sender; + } private Optional parsePartner(final JsonObject playerPageObject) { if (playerPageObject.has(ELEMENT_PUBLICATION_SERVICE)) { @@ -216,8 +290,7 @@ private void parseRelatedFilms(final ArdFilmDto filmDto, final JsonObject player final Optional id = JsonUtils.getAttributeAsString(teasersItemObject, ATTRIBUTE_ID); if (id.isPresent()) { - final String url = ArdConstants.ITEM_URL + id.get(); - + final String url = String.format(ArdConstants.ITEM_URL, id.get()); filmDto.addRelatedFilm(new ArdFilmInfoDto(id.get(), url, 0)); } } @@ -247,17 +320,19 @@ private Film createFilm( film.setGeoLocations( GeoLocationGuesser.getGeoLocations(Sender.ARD, videoInfo.getDefaultVideoUrl())); - if (StringUtils.isNotBlank(videoInfo.getSubtitleUrl())) { - try { - film.addSubtitle(new URL(prepareSubtitleUrl(videoInfo.getSubtitleUrl()))); - } catch (final MalformedURLException ex) { - LOG.error( - "{}, {}, {} Invalid subtitle url: {}", - topic, - title, - date, - videoInfo.getSubtitleUrl(), - ex); + if (videoInfo.getSubtitleUrl().isPresent()) { + for (String subtitleUrl : videoInfo.getSubtitleUrl().get()) { + try { + film.addSubtitle(new URL(subtitleUrl)); + } catch (final MalformedURLException ex) { + LOG.error( + "{}, {}, {} Invalid subtitle url: {}", + topic, + title, + date, + videoInfo.getSubtitleUrl(), + ex); + } } } addUrls(film, videoInfo.getVideoUrls()); @@ -276,14 +351,36 @@ private void addUrls(final Film film, final Map videoUrls) { } } - private Optional parseVideoUrls(final JsonObject playerPageObject) { + private Optional parseVideoUrls(final JsonObject playerPageObject, String videoType, String mimeType) { final Optional mediaCollectionObject = getMediaCollectionObject(playerPageObject); - if (mediaCollectionObject.isPresent()) { - final ArdVideoInfoDto videoDto = - videoDeserializer.deserialize(mediaCollectionObject.get(), null, null); - return Optional.of(videoDto); + if (mediaCollectionObject.isEmpty()) + return Optional.empty(); + final Optional streams = JsonUtils.getElement(mediaCollectionObject.get(), ELEMENT_STREAMS); + if (streams.isEmpty() || !streams.get().isJsonArray() || (streams.get().getAsJsonArray().size() == 0)) + return Optional.empty(); + final Optional media = JsonUtils.getElement(streams.get().getAsJsonArray().get(0), ELEMENT_MEDIA); + if (media.isEmpty() || !media.get().isJsonArray() || (media.get().getAsJsonArray().size() == 0)) + return Optional.empty(); + ArdVideoInfoDto videoInfo = new ArdVideoInfoDto(); + for (JsonElement video : media.get().getAsJsonArray()) { + Optional mime = JsonUtils.getElementValueAsString(video, ATTRIBUTE_MIME); + if (mime.isPresent() && mime.get().equalsIgnoreCase(mimeType)) { + Optional audios = JsonUtils.getElement(video, ELEMENT_AUDIO); + if (audios.isPresent() && audios.get().isJsonArray() && audios.get().getAsJsonArray().size() > 0) { + Optional kind = JsonUtils.getElementValueAsString(audios.get().getAsJsonArray().get(0), ATTRIBUTE_KIND); + Optional res_h = JsonUtils.getElementValueAsString(video, ATTRIBUTE_RESOLUTION_H); + Optional url = JsonUtils.getElementValueAsString(video, ATTRIBUTE_URL); + if (url.isPresent() && res_h.isPresent() && kind.isPresent() && kind.get().equalsIgnoreCase(videoType)) { + Resolution resolution = Resolution.getResolutionFromWidth(Integer.parseInt(res_h.get())); + videoInfo.put(resolution, url.get()); + } + } + } + } + if (videoInfo.getVideoUrls().size() > 0) { + return Optional.of(videoInfo); + } else { + return Optional.empty(); } - - return Optional.empty(); } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java index 53ebb5c46..7c26fd570 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java @@ -52,8 +52,7 @@ private Optional toId(final JsonObject teaserObject) { } private ArdFilmInfoDto createFilmInfo(final String id, final int numberOfClips) { - final String url = ArdConstants.ITEM_URL + id; - + final String url = String.format(ArdConstants.ITEM_URL, id); return new ArdFilmInfoDto(id, url, numberOfClips); } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java index 45b082ef7..45fa59424 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java @@ -1,11 +1,11 @@ package de.mediathekview.mserver.crawler.ard.json; import de.mediathekview.mlib.daten.Resolution; -import org.apache.commons.lang3.StringUtils; import java.util.EnumMap; import java.util.Map; import java.util.Optional; +import java.util.Set; /** * Video information from {@literal @@ -14,7 +14,8 @@ public class ArdVideoInfoDto { private final Map videoUrls; - private String subtitleUrl; + + private Optional> subtitleUrl; public ArdVideoInfoDto() { videoUrls = new EnumMap<>(Resolution.class); @@ -31,20 +32,16 @@ public String getDefaultVideoUrl() { return videoUrls.get(getDefaultQuality()); } - public String getSubtitleUrl() { + public Optional> getSubtitleUrl() { return subtitleUrl; } - public void setSubtitleUrl(final String subtitleUrl) { + public void setSubtitleUrl(final Optional> subtitleUrl) { this.subtitleUrl = subtitleUrl; } - public Optional getSubtitleUrlOptional() { - if (StringUtils.isNotBlank(subtitleUrl)) { - return Optional.of(subtitleUrl); - } - - return Optional.empty(); + public Optional> getSubtitleUrlOptional() { + return subtitleUrl; } public Map getVideoUrls() { diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java index e419ab82f..a22357c22 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java @@ -15,9 +15,12 @@ import java.lang.reflect.Type; import java.net.MalformedURLException; import java.net.URL; +import java.util.EnumMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; /** * Converts json with basic video from {@literal @@ -44,7 +47,9 @@ public ArdVideoInfoDto deserialize( final ArdVideoInfoDto videoInfo = new ArdVideoInfoDto(); final JsonElement subtitleElement = aJsonElement.getAsJsonObject().get(ELEMENT_SUBTITLE_URL); if (subtitleElement != null && !subtitleElement.isJsonNull()) { - videoInfo.setSubtitleUrl(subtitleElement.getAsString()); + Set singleUrl = new HashSet(); + singleUrl.add(subtitleElement.getAsString()); + videoInfo.setSubtitleUrl(Optional.of(singleUrl)); } final Map resolutionUrlMap = @@ -56,7 +61,11 @@ public ArdVideoInfoDto deserialize( final Optional fileType = UrlUtils.getFileType(resolutionUrlMap.get(Resolution.NORMAL).getFile()); if (fileType.isPresent() && fileType.get().equals("m3u8")) { - loadM3U8(resolutionUrlMap); + Map resolutionUrlMapFromM3U = loadM3U8(resolutionUrlMap); + if (resolutionUrlMapFromM3U.size() > 0) { + resolutionUrlMap.clear(); + resolutionUrlMap.putAll(resolutionUrlMapFromM3U); + } } } @@ -82,16 +91,20 @@ private Optional readContent(final URL url) { return Optional.empty(); } - private void loadM3U8(final Map resolutionUrlMap) { + private Map loadM3U8(final Map resolutionUrlMap) { final URL m3u8File = resolutionUrlMap.get(Resolution.NORMAL); + return loadM3U8(m3u8File); + } + + public Map loadM3U8(URL m3u8File) { + final Map urls = new EnumMap<>(Resolution.class); final Optional m3u8Content = readContent(m3u8File); - resolutionUrlMap.clear(); if (m3u8Content.isPresent()) { final String url = m3u8File.toString(); final Optional filename = UrlUtils.getFileName(url); if (filename.isEmpty()) { - return; + return urls; } String baseUrl = url.replaceAll(filename.get(), ""); @@ -107,7 +120,7 @@ private void loadM3U8(final Map resolutionUrlMap) { if (UrlUtils.getProtocol(videoUrl).isEmpty()) { videoUrl = baseUrl + videoUrl; } - resolutionUrlMap.put(resolution.get(), new URL(videoUrl)); + urls.put(resolution.get(), new URL(videoUrl)); } catch (final MalformedURLException malformedURLException) { LOG.error( "ArdVideoInfoJsonDeserializer: invalid url {}", @@ -117,5 +130,6 @@ private void loadM3U8(final Map resolutionUrlMap) { } }); } + return urls; } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java index 3181c0d74..99cf79b7b 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java +++ b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java @@ -151,8 +151,14 @@ protected void processDocument(final SrTopicUrlDTO aUrlDTO, final Document aDocu description.ifPresent(film::setBeschreibung); final ArdVideoInfoDto videoInfo = videoInfoOptional.get(); - if (StringUtils.isNotBlank(videoInfo.getSubtitleUrl())) { - film.addSubtitle(new URL(addMissingProtocol(videoInfo.getSubtitleUrl()))); + if (videoInfo.getSubtitleUrl().isPresent()) { + for (String url : videoInfo.getSubtitleUrl().get()) { + try { + film.addSubtitle(new URL(url)); + } catch (Exception e) { + LOG.error("invalid subtitle url {} {}", url, e); + } + } } addUrls(film, videoInfo.getVideoUrls()); From 6198c0ddebfe9516c335d4a5695882cce5c5a258 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Sun, 28 Apr 2024 14:02:15 +0200 Subject: [PATCH 02/15] fix subtitle --- .../crawler/ard/json/ArdFilmDeserializer.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index b513a2342..1276ea565 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -38,7 +38,7 @@ public class ArdFilmDeserializer implements JsonDeserializer> { private static final String ELEMENT_SHOW = "show"; private static final String ELEMENT_TEASERS = "teasers"; private static final String ELEMENT_WIDGETS = "widgets"; - private static final String ELEMENT_SUBTITLES = "subtitles"; + private static final String[] ELEMENT_SUBTITLES = {"mediaCollection","embedded","subtitles"}; private static final String ELEMENT_SOURCES = "sources"; private static final String ELEMENT_STREAMS = "streams"; private static final String ELEMENT_MEDIA = "media"; @@ -167,7 +167,7 @@ public List deserialize( final Optional videoInfoStandard = parseVideoUrls(itemObject, "standard", "video/mp4"); final Optional videoInfoAdaptive = parseVideoUrls(itemObject, "standard", "application/vnd.apple.mpegurl"); final Optional videoInfoAD = parseVideoUrls(itemObject, "standard", "audio-description"); - final Optional videoInfoDGS = parseVideoUrls(itemObject, "standard", "sign-language"); + //final Optional videoInfoDGS = parseVideoUrls(itemObject, "standard", "sign-language"); // FUNK provides adaptive only Optional videoInfo = videoInfoStandard; if (videoInfoStandard.isEmpty() && videoInfoAD.isEmpty()) { @@ -179,7 +179,7 @@ public List deserialize( && title.isPresent() && videoInfo.isPresent() && videoInfo.get().getVideoUrls().size() > 0) { - videoInfo.get().setSubtitleUrl(prepareSubtitleUrl(jsonElement)); + videoInfo.get().setSubtitleUrl(prepareSubtitleUrl(itemObject)); // add film to ARD final ArdFilmDto filmDto = new ArdFilmDto( @@ -193,11 +193,15 @@ public List deserialize( videoInfo.get())); films.add(filmDto); // + if (widgets.size() > 1) { + parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); + } + // if (topic.isPresent() && title.isPresent() && videoInfoAD.isPresent() && videoInfoAD.get().getVideoUrls().size() > 0) { - videoInfoAD.get().setSubtitleUrl(prepareSubtitleUrl(jsonElement)); + videoInfoAD.get().setSubtitleUrl(prepareSubtitleUrl(itemObject)); // add film to ARD final ArdFilmDto filmDtoAD = new ArdFilmDto( @@ -210,10 +214,6 @@ public List deserialize( duration.orElse(null), videoInfo.get())); films.add(filmDtoAD); - // - if (widgets.size() > 1) { - parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); - } } } else { LOG.debug("No title, topic or video found for {} {} {} ", title, topic, sender); From 1daa35a083baa8497c33cc50b0f65f43ecc2141e Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:38:36 +0200 Subject: [PATCH 03/15] fix to stop loading page 1 if it does not exists --- .../mserver/crawler/ard/ArdTopicInfoDto.java | 57 ++++++++++++------- .../ard/json/ArdTopicPageDeserializer.java | 9 ++- .../crawler/ard/tasks/ArdTopicPageTask.java | 41 +++++-------- ...rdTopicPageDeserializerPaginationTest.java | 5 +- 4 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdTopicInfoDto.java b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdTopicInfoDto.java index c60ae7a2f..a36b4da79 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdTopicInfoDto.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdTopicInfoDto.java @@ -5,34 +5,22 @@ public class ArdTopicInfoDto { private final Set filmInfos; - private int subPageNumber; - private int maxSubPageNumber; + private int pageNumber; + private int pageSize; + private int totalElements; + public ArdTopicInfoDto(final Set filmInfos) { this.filmInfos = filmInfos; - subPageNumber = 0; - maxSubPageNumber = 0; + setPageNumber(0); + setPageSize(0); + setTotalElements(0); } public Set getFilmInfos() { return filmInfos; } - public int getSubPageNumber() { - return subPageNumber; - } - - public void setSubPageNumber(final int subPageNumber) { - this.subPageNumber = subPageNumber; - } - - public int getMaxSubPageNumber() { - return maxSubPageNumber; - } - - public void setMaxSubPageNumber(final int maxSubPageNumber) { - this.maxSubPageNumber = maxSubPageNumber; - } @Override public boolean equals(final Object o) { @@ -42,13 +30,38 @@ public boolean equals(final Object o) { if (!(o instanceof final ArdTopicInfoDto that)) { return false; } - return getSubPageNumber() == that.getSubPageNumber() - && getMaxSubPageNumber() == that.getMaxSubPageNumber() + return getPageNumber() == that.getPageNumber() + && getPageSize() == that.getPageSize() + && getTotalElements() == that.getTotalElements() && Objects.equals(filmInfos, that.filmInfos); } @Override public int hashCode() { - return Objects.hash(filmInfos, getSubPageNumber(), getMaxSubPageNumber()); + return Objects.hash(filmInfos, getPageNumber(), getPageSize(), getTotalElements()); + } + + public int getPageNumber() { + return pageNumber; + } + + public void setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getTotalElements() { + return totalElements; + } + + public void setTotalElements(int totalElements) { + this.totalElements = totalElements; } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializer.java index 7bcc9ba54..b4f166811 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializer.java @@ -30,13 +30,12 @@ public ArdTopicInfoDto deserialize( } final JsonElement paginationElement = showPageObject.get(ELEMENT_PAGINATION); - ardTopicInfoDto.setSubPageNumber( - getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_PAGE_NUMBER)); + final int pageNumber = getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_PAGE_NUMBER); final int totalElements = getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_TOTAL_ELEMENTS); final int pageSize = getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_PAGE_SIZE); - ardTopicInfoDto.setMaxSubPageNumber(pageSize == 0 ? 0 : - (totalElements+pageSize-1)/pageSize); - + ardTopicInfoDto.setPageNumber(pageNumber); + ardTopicInfoDto.setPageSize(pageSize); + ardTopicInfoDto.setTotalElements(totalElements); return ardTopicInfoDto; } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicPageTask.java b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicPageTask.java index 805ef3152..53472d506 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicPageTask.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicPageTask.java @@ -14,8 +14,7 @@ import java.lang.reflect.Type; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.stream.Collectors; -import java.util.stream.IntStream; + public class ArdTopicPageTask extends ArdTaskBase { private static final Logger LOG = LogManager.getLogger(ArdTopicPageTask.class); @@ -52,35 +51,21 @@ protected void processRestTarget(final CrawlerUrlDTO aDTO, final WebTarget aTarg private Queue createSubPageUrls( final WebTarget aTarget, final ArdTopicInfoDto topicInfo) { final Queue subpages = new ConcurrentLinkedQueue<>(); - - final int actualSubPageNumber = topicInfo.getSubPageNumber(); - final Integer maximumAllowedSubpages = crawler.getCrawlerConfig().getMaximumSubpages(); - if (actualSubPageNumber != 0) { - LOG.debug("Sub page {} is already the maximum allowed sub page.", actualSubPageNumber); + if (topicInfo.getTotalElements() < topicInfo.getPageSize() || topicInfo.getPageNumber() > 0) { return subpages; } - - final int maxSubPageNumber = topicInfo.getMaxSubPageNumber(); - subpages.addAll( - IntStream.range( - actualSubPageNumber + 1, - (maximumAllowedSubpages >= maxSubPageNumber - ? maxSubPageNumber - : maximumAllowedSubpages) - + 1) - .parallel() - .mapToObj(subpageNumber -> changePageNumber(aTarget, subpageNumber)) - .map(CrawlerUrlDTO::new) - .collect(Collectors.toSet())); - - if (LOG.isDebugEnabled() && maxSubPageNumber > maximumAllowedSubpages) { - LOG.debug( - "Found {} sub pages, these are {} more then the allowed {} to crawl. Added {} and skipped the rest.", - maxSubPageNumber, - maxSubPageNumber - maximumAllowedSubpages, - maximumAllowedSubpages, - subpages.size()); + // + final Integer maximumAllowedSubpages = crawler.getCrawlerConfig().getMaximumSubpages(); + int index = 0; + while ((topicInfo.getPageSize() + (index * topicInfo.getPageSize())) < topicInfo.getTotalElements()) { + subpages.add(new CrawlerUrlDTO(changePageNumber(aTarget, index + 1))); + index++; + if (index >= maximumAllowedSubpages) { + LOG.debug("ignore more subpage due to limit of {} pages but found {}", maximumAllowedSubpages, Integer.valueOf(topicInfo.getTotalElements() / topicInfo.getPageSize())); + break; + } } + LOG.debug("Found {} subpage", subpages.size()); return subpages; } diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerPaginationTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerPaginationTest.java index b8ec457b4..8c3f23051 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerPaginationTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerPaginationTest.java @@ -17,7 +17,8 @@ public void testDeserializePagination() { final ArdTopicInfoDto ardTopicInfoDto = instance.deserialize(jsonElement, null, null); - assertThat(ardTopicInfoDto.getSubPageNumber(), is(0)); - assertThat(ardTopicInfoDto.getMaxSubPageNumber(), is(5)); + assertThat(ardTopicInfoDto.getPageNumber(), is(0)); + assertThat(ardTopicInfoDto.getPageSize(), is(50)); + assertThat(ardTopicInfoDto.getTotalElements(), is(204)); } } From b021995cc57bb8d3d6b913ef36fc6e04dc5260a0 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:38:53 +0200 Subject: [PATCH 04/15] add resolution --- .../java/de/mediathekview/mserver/crawler/basic/M3U8Dto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/mediathekview/mserver/crawler/basic/M3U8Dto.java b/src/main/java/de/mediathekview/mserver/crawler/basic/M3U8Dto.java index a7e2d71a6..0ab782338 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/basic/M3U8Dto.java +++ b/src/main/java/de/mediathekview/mserver/crawler/basic/M3U8Dto.java @@ -56,6 +56,7 @@ public Optional getResolution() { case "288x216": case "320x180": case "180x320": + case "320x176": case "320x240": case "360x270": case "384x288": From 807fc6406112cbf01b0c4d08e2b20c768c9caaea Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:43:01 +0200 Subject: [PATCH 05/15] use String.format --- .../ard/json/ArdDayPageDeserializerTest.java | 16 ++++++++-------- .../ard/json/ArdTopicPageDeserializerTest.java | 12 +++++++----- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdDayPageDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdDayPageDeserializerTest.java index af5015bcb..7d7d07e6d 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdDayPageDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdDayPageDeserializerTest.java @@ -22,35 +22,35 @@ public void testDeserialize() { new ArdFilmInfoDto[] { new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzc", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzc", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzc"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzg", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzg", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5Nzg"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5ODI", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5ODI", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5ODI"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE4MjA", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE4MjA", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE4MjA"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDEyMDM", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDEyMDM", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDEyMDM"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5OTI", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5OTI", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5OTI"), 7), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzI", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzI", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzI"), 1), new ArdFilmInfoDto( "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzE", - ArdConstants.ITEM_URL + "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzE", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2hyLW9ubGluZS8xMDE5NzE"), 1) }; diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerTest.java index bcab74769..a504053ee 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicPageDeserializerTest.java @@ -1,6 +1,8 @@ package de.mediathekview.mserver.crawler.ard.json; import com.google.gson.JsonElement; + +import de.mediathekview.mserver.crawler.ard.ArdConstants; import de.mediathekview.mserver.crawler.ard.ArdFilmInfoDto; import de.mediathekview.mserver.crawler.ard.ArdTopicInfoDto; import de.mediathekview.mserver.testhelper.JsonFileReader; @@ -21,23 +23,23 @@ public void testDeserialize() { new ArdFilmInfoDto[]{ new ArdFilmInfoDto( "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzFmOTkwMzNlLWY1MjUtNDk4Yy1iZjQ5LWIwZjZjYjhjNzRkYQ", - "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzFmOTkwMzNlLWY1MjUtNDk4Yy1iZjQ5LWIwZjZjYjhjNzRkYQ", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzFmOTkwMzNlLWY1MjUtNDk4Yy1iZjQ5LWIwZjZjYjhjNzRkYQ"), 0), new ArdFilmInfoDto( "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzkzM2QzZjFjLTlkMWQtNGFlNy1hNDA5LTlhMjdjNGI0NTdjZA", - "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzkzM2QzZjFjLTlkMWQtNGFlNy1hNDA5LTlhMjdjNGI0NTdjZA", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzkzM2QzZjFjLTlkMWQtNGFlNy1hNDA5LTlhMjdjNGI0NTdjZA"), 0), new ArdFilmInfoDto( "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzg1NTVhNjlmLWNkMDMtNDY3ZS04MWJmLWU3YmI4YjIxNGJjMw", - "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzg1NTVhNjlmLWNkMDMtNDY3ZS04MWJmLWU3YmI4YjIxNGJjMw", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzg1NTVhNjlmLWNkMDMtNDY3ZS04MWJmLWU3YmI4YjIxNGJjMw"), 0), new ArdFilmInfoDto( "Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2FhNDRiYTVhLWMzOWItNDgyMy1iNDZjLTZhMjBlYTAyN2I0ZQ", - "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2FhNDRiYTVhLWMzOWItNDgyMy1iNDZjLTZhMjBlYTAyN2I0ZQ", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2FhNDRiYTVhLWMzOWItNDgyMy1iNDZjLTZhMjBlYTAyN2I0ZQ"), 0), new ArdFilmInfoDto( "Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2M2MzU2NTJjLWVkYTAtNDNkNS05ZTJkLTliMzBkZTI2NzM2Mw", - "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2M2MzU2NTJjLWVkYTAtNDNkNS05ZTJkLTliMzBkZTI2NzM2Mw", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2M2MzU2NTJjLWVkYTAtNDNkNS05ZTJkLTliMzBkZTI2NzM2Mw"), 0), }; From 4ab49ce2f9bc0a026b449bffc9aa2a6c8b848a36 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:43:55 +0200 Subject: [PATCH 06/15] little helper to create/validate testcases --- .../mserver/testhelper/AssertFilm.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/de/mediathekview/mserver/testhelper/AssertFilm.java b/src/test/java/de/mediathekview/mserver/testhelper/AssertFilm.java index 95cac0e12..e285fb246 100644 --- a/src/test/java/de/mediathekview/mserver/testhelper/AssertFilm.java +++ b/src/test/java/de/mediathekview/mserver/testhelper/AssertFilm.java @@ -135,6 +135,33 @@ public static void assertUrl(final String aExpectedUrl, final FilmUrl aActualUrl equalTo(cleanupWireMockUrlForCheck(aExpectedUrl))); } } + + // generate a test case constructor from a film + public static String toTestCase(final String fileNameAndPath, final Film f) { + String x = ("" + + "/*jsonFile*/ \""+fileNameAndPath+"\"" + ",\n" + + "/*topic*/ \""+ f.getThema()+"\"" + ",\n" + + "/*title*/ \""+ f.getTitel()+"\"" + ",\n" + + "/*description*/ \""+ f.getBeschreibung()+"\"" + ",\n" + + "/*date*/ LocalDateTime.parse(\""+ f.getTime().toString()+"\")" + ",\n" + + "/*duration*/ Duration.parse(\""+ f.getDuration().toString()+"\")" + ",\n" + + "/*small*/ \""+ f.getUrl(Resolution.SMALL)+"\"" + ",\n" + + "/*normal*/ \""+ f.getUrl(Resolution.NORMAL)+"\"" + ",\n" + + "/*hd*/ \""+ f.getUrl(Resolution.HD)+"\"" + ",\n" + + "/*ADsmall*/ \""+ (f.getAudioDescription(Resolution.SMALL) != null ? f.getAudioDescription(Resolution.SMALL) : "") +"\"" + ",\n" + + "/*ADnormal*/ \""+ (f.getAudioDescription(Resolution.NORMAL) != null ? f.getAudioDescription(Resolution.NORMAL) : "")+"\"" + ",\n" + + "/*ADhd*/ \""+ (f.getAudioDescription(Resolution.HD) != null ? f.getAudioDescription(Resolution.HD) : "")+"\"" + ",\n" + + "/*DGSsmall*/ \""+ (f.getSignLanguage(Resolution.SMALL) != null ? f.getSignLanguage(Resolution.SMALL) : "") +"\"" + ",\n" + + "/*DGSnormal*/ \""+ (f.getSignLanguage(Resolution.NORMAL) != null ? f.getSignLanguage(Resolution.NORMAL) : "")+"\"" + ",\n" + + "/*DGShd*/ \""+ (f.getSignLanguage(Resolution.HD) != null ? f.getSignLanguage(Resolution.HD) : "")+"\"" + ",\n" + + "/*sub*/ \""+ (f.getSubtitles().parallelStream().findFirst().isPresent() ? f.getSubtitles().parallelStream().findFirst().get().toString(): "")+"\"" + ",\n" + + "/*website*/ \""+ (f.getWebsite().isPresent() ? f.getWebsite().get().toString() : "")+"\"" + ",\n" + + "/*hd*/ GeoLocations."+ f.getGeoLocations().toString() + ",\n" + + "/*related*/ new ArdFilmInfoDto[0]" + ",\n" + + "/*sender*/ Optional.of(Sender."+f.getSender()+")" + ",\n" + + ""); + return x; + } private static String cleanupWireMockUrlForCheck(final String urlToCleanUp) { return urlToCleanUp.replaceAll("localhost:\\d+", "localhost:8589"); @@ -167,4 +194,5 @@ private static void assertSignLanguages( assertUrl(aExpectedUrlSignLanguageNormal, aActualFilm.getSignLanguage(Resolution.NORMAL)); assertUrl(aExpectedUrlSignLanguageHd, aActualFilm.getSignLanguage(Resolution.HD)); } + } From 6f6b30f2f69fe3ab1bc7ea931b0da77687a71820 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:45:44 +0200 Subject: [PATCH 07/15] new handling of AD, DGS movies --- .../crawler/ard/json/ArdFilmDeserializer.java | 163 ++-- .../crawler/ard/json/ArdVideoInfoDto.java | 63 +- .../ard/json/ArdFilmDeserializerTest.java | 381 +++++--- .../ard/tasks/ArdFilmDetailTaskTest.java | 84 +- src/test/resources/ard/ard_film_page11.json | 285 ------ .../resources/ard/ard_film_page_arte_geo.json | 1 - .../ard/ard_film_page_encoding_nbsp.json | 1 - .../resources/ard/ard_film_page_funk.json | 235 ----- .../resources/ard/ard_film_page_ndr11.json | 1 - .../ard_film_page_only_single_resolution.json | 196 ---- src/test/resources/ard/ard_film_page_uhd.json | 213 ---- .../ard/ard_film_page_with_related11.json | 1 - src/test/resources/ard/ard_item_DGS_AD.json | 540 +++++++++++ .../resources/ard/ard_item_DGS_UT_AD.json | 909 ++++++++++++++++++ .../ard/ard_item_STD_AD_DasErste.json | 504 ++++++++++ .../resources/ard/ard_item_STD_AD_MDR.json | 460 +++++++++ .../resources/ard/ard_item_STD_AD_SWR.json | 482 ++++++++++ src/test/resources/ard/ard_item_STD_BR.json | 508 ++++++++++ .../resources/ard/ard_item_STD_DasErste.json | 541 +++++++++++ src/test/resources/ard/ard_item_STD_HR.json | 377 ++++++++ src/test/resources/ard/ard_item_STD_NDR.json | 398 ++++++++ src/test/resources/ard/ard_item_STD_ONE.json | 405 ++++++++ src/test/resources/ard/ard_item_STD_RBB.json | 377 ++++++++ src/test/resources/ard/ard_item_fallback.json | 429 +++++++++ .../resources/ard/ard_item_fallback_m3u.txt | 33 + 25 files changed, 6439 insertions(+), 1148 deletions(-) delete mode 100644 src/test/resources/ard/ard_film_page11.json delete mode 100644 src/test/resources/ard/ard_film_page_arte_geo.json delete mode 100644 src/test/resources/ard/ard_film_page_encoding_nbsp.json delete mode 100644 src/test/resources/ard/ard_film_page_funk.json delete mode 100644 src/test/resources/ard/ard_film_page_ndr11.json delete mode 100644 src/test/resources/ard/ard_film_page_only_single_resolution.json delete mode 100644 src/test/resources/ard/ard_film_page_uhd.json delete mode 100644 src/test/resources/ard/ard_film_page_with_related11.json create mode 100644 src/test/resources/ard/ard_item_DGS_AD.json create mode 100644 src/test/resources/ard/ard_item_DGS_UT_AD.json create mode 100644 src/test/resources/ard/ard_item_STD_AD_DasErste.json create mode 100644 src/test/resources/ard/ard_item_STD_AD_MDR.json create mode 100644 src/test/resources/ard/ard_item_STD_AD_SWR.json create mode 100644 src/test/resources/ard/ard_item_STD_BR.json create mode 100644 src/test/resources/ard/ard_item_STD_DasErste.json create mode 100644 src/test/resources/ard/ard_item_STD_HR.json create mode 100644 src/test/resources/ard/ard_item_STD_NDR.json create mode 100644 src/test/resources/ard/ard_item_STD_ONE.json create mode 100644 src/test/resources/ard/ard_item_STD_RBB.json create mode 100644 src/test/resources/ard/ard_item_fallback.json create mode 100644 src/test/resources/ard/ard_item_fallback_m3u.txt diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 1276ea565..1dd09e36d 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -164,22 +164,13 @@ public List deserialize( final Optional date = parseDate(itemObject); final Optional duration = parseDuration(itemObject); final Sender sender = determinePartner(itemObject); - final Optional videoInfoStandard = parseVideoUrls(itemObject, "standard", "video/mp4"); - final Optional videoInfoAdaptive = parseVideoUrls(itemObject, "standard", "application/vnd.apple.mpegurl"); - final Optional videoInfoAD = parseVideoUrls(itemObject, "standard", "audio-description"); - //final Optional videoInfoDGS = parseVideoUrls(itemObject, "standard", "sign-language"); - // FUNK provides adaptive only - Optional videoInfo = videoInfoStandard; - if (videoInfoStandard.isEmpty() && videoInfoAD.isEmpty()) { - videoInfo = fallbackToM3U(videoInfoAdaptive); + final Optional videoInfo = parseVideos(itemObject, title); + + if (title.isEmpty() || topic.isEmpty() || videoInfo.isEmpty()) { + return films; } - - - if (topic.isPresent() - && title.isPresent() - && videoInfo.isPresent() - && videoInfo.get().getVideoUrls().size() > 0) { - videoInfo.get().setSubtitleUrl(prepareSubtitleUrl(itemObject)); + // normal + if (videoInfo.isPresent()) { // add film to ARD final ArdFilmDto filmDto = new ArdFilmDto( @@ -191,47 +182,26 @@ public List deserialize( date.orElse(null), duration.orElse(null), videoInfo.get())); - films.add(filmDto); - // if (widgets.size() > 1) { parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); } - // - if (topic.isPresent() - && title.isPresent() - && videoInfoAD.isPresent() - && videoInfoAD.get().getVideoUrls().size() > 0) { - videoInfoAD.get().setSubtitleUrl(prepareSubtitleUrl(itemObject)); - // add film to ARD - final ArdFilmDto filmDtoAD = - new ArdFilmDto( - createFilm( - sender, - topic.get(), - title.get(), - description.orElse(null), - date.orElse(null), - duration.orElse(null), - videoInfo.get())); - films.add(filmDtoAD); - } - } else { - LOG.debug("No title, topic or video found for {} {} {} ", title, topic, sender); + films.add(filmDto); } - + return films; } - private Optional fallbackToM3U(Optional m3u) { + private Optional> fallbackToM3U(Optional m3u) { // FUNK provides adaptive only - if (m3u.isPresent() && m3u.get().containsResolution(Resolution.NORMAL)) { + if (m3u.isPresent() && !m3u.get().getVideoUrls().isEmpty()) { + String m3uUrl = m3u.get().getVideoUrls().values().toArray(new String[1])[0]; Map resolutionUrlMapFromM3U; try { - resolutionUrlMapFromM3U = videoDeserializer.loadM3U8(new URL(m3u.get().getVideoUrls().get(Resolution.NORMAL))); + resolutionUrlMapFromM3U = videoDeserializer.loadM3U8(new URL(m3uUrl)); if (resolutionUrlMapFromM3U.size() > 0) { - ArdVideoInfoDto newVideoInfo = new ArdVideoInfoDto(); - resolutionUrlMapFromM3U.forEach((key, value) -> newVideoInfo.put(key, value.toString())); - return Optional.of(newVideoInfo); + Map newUrls = new EnumMap<>(Resolution.class); + resolutionUrlMapFromM3U.forEach((key, value) -> newUrls.put(key, value.toString())); + return Optional.of(newUrls); } } catch (MalformedURLException e) { // TODO Auto-generated catch block @@ -318,8 +288,9 @@ private Film createFilm( Optional.ofNullable(description).ifPresent(film::setBeschreibung); - film.setGeoLocations( - GeoLocationGuesser.getGeoLocations(Sender.ARD, videoInfo.getDefaultVideoUrl())); + + film.setGeoLocations(GeoLocationGuesser.getGeoLocations(Sender.ARD, videoInfo.getDefaultVideoUrl())); + if (videoInfo.getSubtitleUrl().isPresent()) { for (String subtitleUrl : videoInfo.getSubtitleUrl().get()) { try { @@ -336,6 +307,8 @@ private Film createFilm( } } addUrls(film, videoInfo.getVideoUrls()); + addADUrls(film, videoInfo.getVideoUrlsAD()); + addDGSUrls(film, videoInfo.getVideoUrlsDGS()); return film; } @@ -350,34 +323,96 @@ private void addUrls(final Film film, final Map videoUrls) { } } } + + private void addADUrls(final Film film, final Map videoUrls) { + for (final Map.Entry qualitiesEntry : videoUrls.entrySet()) { + final String url = qualitiesEntry.getValue(); + try { + film.addAudioDescription(qualitiesEntry.getKey(), new FilmUrl(url, crawler.determineFileSizeInKB(url))); + } catch (final MalformedURLException ex) { + LOG.error("InvalidUrl AD: {}", url, ex); + } + } + } + + private void addDGSUrls(final Film film, final Map videoUrls) { + for (final Map.Entry qualitiesEntry : videoUrls.entrySet()) { + final String url = qualitiesEntry.getValue(); + try { + film.addSignLanguage(qualitiesEntry.getKey(), new FilmUrl(url, crawler.determineFileSizeInKB(url))); + } catch (final MalformedURLException ex) { + LOG.error("InvalidUrl AD: {}", url, ex); + } + } + } + + private Optional parseVideos(final JsonObject playerPageObject, Optional title) { + ArdVideoInfoDto allVideoUrls = new ArdVideoInfoDto(); + // + final Optional> videoInfoStandard = parseVideoUrls(playerPageObject, "main", "standard", "video/mp4"); + final Optional> videoInfoAdaptive = parseVideoUrls(playerPageObject, "main", "standard", "application/vnd.apple.mpegurl"); + final Optional> videoInfoAD = parseVideoUrls(playerPageObject, "main", "audio-description", "video/mp4"); + final Optional> videoInfoDGS = parseVideoUrls(playerPageObject, "sign-language", "standard", "video/mp4"); + final Optional> subtitles = prepareSubtitleUrl(playerPageObject); + // + if (subtitles.isPresent()) { + allVideoUrls.setSubtitleUrl(subtitles); + } + if (videoInfoAD.isPresent()) { + allVideoUrls.putAllAD(videoInfoAD.get()); + } + if (videoInfoDGS.isPresent()) { + allVideoUrls.putAllDGS(videoInfoDGS.get()); + } + if (videoInfoStandard.isPresent()) { + allVideoUrls.putAll(videoInfoStandard.get()); + } else if (videoInfoAdaptive.isPresent()) { + ArdVideoInfoDto fallbackM3UUrl = new ArdVideoInfoDto(); + fallbackM3UUrl.putAll(videoInfoAdaptive.get()); + Optional> fallback = fallbackToM3U(Optional.of(fallbackM3UUrl)); + if (fallback.isPresent()) { + allVideoUrls.putAll(fallback.get()); + } + } + if (allVideoUrls.getVideoUrls().isEmpty() && allVideoUrls.getVideoUrlsAD().isEmpty() && allVideoUrls.getVideoUrlsDGS().isEmpty() ) { + return Optional.empty(); + } + return Optional.of(allVideoUrls); + } - private Optional parseVideoUrls(final JsonObject playerPageObject, String videoType, String mimeType) { + private Optional> parseVideoUrls(final JsonObject playerPageObject, String streamType, String aduioType, String mimeType) { final Optional mediaCollectionObject = getMediaCollectionObject(playerPageObject); if (mediaCollectionObject.isEmpty()) return Optional.empty(); final Optional streams = JsonUtils.getElement(mediaCollectionObject.get(), ELEMENT_STREAMS); if (streams.isEmpty() || !streams.get().isJsonArray() || (streams.get().getAsJsonArray().size() == 0)) return Optional.empty(); - final Optional media = JsonUtils.getElement(streams.get().getAsJsonArray().get(0), ELEMENT_MEDIA); - if (media.isEmpty() || !media.get().isJsonArray() || (media.get().getAsJsonArray().size() == 0)) - return Optional.empty(); - ArdVideoInfoDto videoInfo = new ArdVideoInfoDto(); - for (JsonElement video : media.get().getAsJsonArray()) { - Optional mime = JsonUtils.getElementValueAsString(video, ATTRIBUTE_MIME); - if (mime.isPresent() && mime.get().equalsIgnoreCase(mimeType)) { - Optional audios = JsonUtils.getElement(video, ELEMENT_AUDIO); - if (audios.isPresent() && audios.get().isJsonArray() && audios.get().getAsJsonArray().size() > 0) { - Optional kind = JsonUtils.getElementValueAsString(audios.get().getAsJsonArray().get(0), ATTRIBUTE_KIND); - Optional res_h = JsonUtils.getElementValueAsString(video, ATTRIBUTE_RESOLUTION_H); - Optional url = JsonUtils.getElementValueAsString(video, ATTRIBUTE_URL); - if (url.isPresent() && res_h.isPresent() && kind.isPresent() && kind.get().equalsIgnoreCase(videoType)) { - Resolution resolution = Resolution.getResolutionFromWidth(Integer.parseInt(res_h.get())); - videoInfo.put(resolution, url.get()); + // + Map videoInfo = new EnumMap<>(Resolution.class); + for (JsonElement streamsCategory : streams.get().getAsJsonArray()) { + final Optional streamKind = JsonUtils.getElementValueAsString(streamsCategory, ATTRIBUTE_KIND); + final Optional media = JsonUtils.getElement(streamsCategory, ELEMENT_MEDIA); + if (media.isEmpty() || !media.get().isJsonArray() || (media.get().getAsJsonArray().size() == 0)) + return Optional.empty(); + if (streamKind.orElse("").equalsIgnoreCase(streamType)) { + for (JsonElement video : media.get().getAsJsonArray()) { + Optional mime = JsonUtils.getElementValueAsString(video, ATTRIBUTE_MIME); + if (mime.isPresent() && mime.get().equalsIgnoreCase(mimeType)) { + Optional audios = JsonUtils.getElement(video, ELEMENT_AUDIO); + if (audios.isPresent() && audios.get().isJsonArray() && audios.get().getAsJsonArray().size() > 0) { + Optional kind = JsonUtils.getElementValueAsString(audios.get().getAsJsonArray().get(0), ATTRIBUTE_KIND); + Optional res_h = JsonUtils.getElementValueAsString(video, ATTRIBUTE_RESOLUTION_H); + Optional url = JsonUtils.getElementValueAsString(video, ATTRIBUTE_URL); + if (url.isPresent() && res_h.isPresent() && kind.isPresent() && kind.get().equalsIgnoreCase(aduioType)) { + Resolution resolution = Resolution.getResolutionFromWidth(Integer.parseInt(res_h.get())); + videoInfo.put(resolution, url.get()); + } + } } } } } - if (videoInfo.getVideoUrls().size() > 0) { + if (videoInfo.size() > 0) { return Optional.of(videoInfo); } else { return Optional.empty(); diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java index 45fa59424..1d3bba7c5 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java @@ -4,8 +4,10 @@ import java.util.EnumMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.stream.Stream; /** * Video information from {@literal @@ -14,22 +16,43 @@ public class ArdVideoInfoDto { private final Map videoUrls; + private final Map videoUrlsAD; + private final Map videoUrlsDGS; private Optional> subtitleUrl; public ArdVideoInfoDto() { videoUrls = new EnumMap<>(Resolution.class); + videoUrlsAD = new EnumMap<>(Resolution.class); + videoUrlsDGS = new EnumMap<>(Resolution.class); + subtitleUrl = Optional.empty(); } public Resolution getDefaultQuality() { - if (videoUrls.containsKey(Resolution.NORMAL)) { + if (videoUrls.containsKey(Resolution.NORMAL) || + videoUrlsAD.containsKey(Resolution.NORMAL) || + videoUrlsDGS.containsKey(Resolution.NORMAL)) { return Resolution.NORMAL; } - return videoUrls.keySet().iterator().next(); + return Stream.of(videoUrls.keySet(), videoUrlsAD.keySet(), videoUrlsDGS.keySet()) + .flatMap(map -> map.stream()) + .findFirst() + .orElse(Resolution.SMALL); } public String getDefaultVideoUrl() { - return videoUrls.get(getDefaultQuality()); + if (videoUrls.containsKey(getDefaultQuality())) { + return videoUrls.get(getDefaultQuality()); + } else if (videoUrlsAD.containsKey(getDefaultQuality())) { + return videoUrlsAD.get(getDefaultQuality()); + } else if (videoUrlsDGS.containsKey(getDefaultQuality())) { + return videoUrlsDGS.get(getDefaultQuality()); + } + return Stream.of(videoUrls.values(), videoUrlsAD.values(), videoUrlsDGS.values()) + .flatMap(map -> map.stream()) + .findFirst() + .orElse(null); + } public Optional> getSubtitleUrl() { @@ -55,4 +78,38 @@ public boolean containsResolution(final Resolution key) { public String put(final Resolution key, final String value) { return videoUrls.put(key, value); } + + public void putAll(Map entries) { + for (Entry e : entries.entrySet()) { + put(e.getKey(), e.getValue()); + } + } + + public Map getVideoUrlsAD() { + return videoUrlsAD; + } + + public String putAD(final Resolution key, final String value) { + return videoUrlsAD.put(key, value); + } + + public void putAllAD(Map entries) { + for (Entry e : entries.entrySet()) { + putAD(e.getKey(), e.getValue()); + } + } + + public Map getVideoUrlsDGS() { + return videoUrlsDGS; + } + + public String putDGS(final Resolution key, final String value) { + return videoUrlsDGS.put(key, value); + } + + public void putAllDGS(Map entries) { + for (Entry e : entries.entrySet()) { + putDGS(e.getKey(), e.getValue()); + } + } } 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 35dbc3dae..b82c59de9 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 @@ -37,6 +37,12 @@ public class ArdFilmDeserializerTest { private final String expectedUrlSmall; private final String expectedUrlNormal; private final String expectedUrlHd; + private final String expectedADUrlSmall; + private final String expectedADUrlNormal; + private final String expectedADUrlHd; + private final String expectedDGSUrlSmall; + private final String expectedDGSUrlNormal; + private final String expectedDGSUrlHd; private final String expectedSubtitle; private final GeoLocations expectedGeo; private final ArdFilmInfoDto[] relatedFilms; @@ -55,6 +61,12 @@ public ArdFilmDeserializerTest( final String expectedUrlSmall, final String expectedUrlNormal, final String expectedUrlHd, + final String expectedADUrlSmall, + final String expectedADUrlNormal, + final String expectedADUrlHd, + final String expectedDGSUrlSmall, + final String expectedDGSUrlNormal, + final String expectedDGSUrlHd, final String expectedSubtitle, final GeoLocations expectedGeo, final ArdFilmInfoDto[] relatedFilms, @@ -68,6 +80,12 @@ public ArdFilmDeserializerTest( this.expectedUrlSmall = expectedUrlSmall; this.expectedUrlNormal = expectedUrlNormal; this.expectedUrlHd = expectedUrlHd; + this.expectedADUrlSmall = expectedADUrlSmall; + this.expectedADUrlNormal = expectedADUrlNormal; + this.expectedADUrlHd = expectedADUrlHd; + this.expectedDGSUrlSmall = expectedDGSUrlSmall; + this.expectedDGSUrlNormal = expectedDGSUrlNormal; + this.expectedDGSUrlHd = expectedDGSUrlHd; this.expectedSubtitle = expectedSubtitle; this.expectedGeo = expectedGeo; this.relatedFilms = relatedFilms; @@ -80,140 +98,254 @@ public static Collection data() { return Arrays.asList( new Object[][] { { - "/ard/ard_film_page11.json", - "Tagesschau", - "tagesschau, 09:00 Uhr", - "Themen der Sendung: Bundestag und Bundesrat stimmen über Kohleausstieg ab, Werbeverbot für Tabak wird verschärft, Großbritannien lockert Corona-Einreisebeschränkungen, Zahl der Corona-Neuinfektionen in den USA erreicht neuen Höchststand, Urteil im Prozess gegen Menschenrechtler Steudtner in Istanbul erwartet, Hongkonger Bürgerrechtsaktivist bittet Deutschland um Hilfe für die Demokratie-Bewegung, \n.....", - LocalDateTime.of(2020, 7, 3, 9, 0, 0), - Duration.ofMinutes(4).plusSeconds(9), - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webml.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webl.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webxl.h264.mp4", - "https://www.ardmediathek.de/subtitle/410890", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.empty() + /*jsonFile*/ "/ard/ard_item_DGS_AD.json", + /*topic*/ "Sesamstraße Magazin", + /*title*/ "Die schlaflose Eule (mit Gebärdensprache)", + /*description*/ "2893. Ernie & Jan Delay bringen den müden Bert mit ihrem Lied um seinen nächtlichen Schlaf. In einer neuen Sesamstraßen Reihe nehmen uns Kinder mit an ihre \"Lieblingsorte\". Heute besuchen wir mit Elli (4), Jonathan (5) und Mattis (8) das nächtliche Miniaturwunderland. Außerdem hat der Prinz Probleme damit, Dornröschen zu wecken und Krümelmonster bringt Abby zur Verzweiflung. Susi Schraube erfindet\n.....", + /*date*/ LocalDateTime.parse("2024-02-19T07:45"), + /*duration*/ Duration.parse("PT20M26S"), + /*small*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.ln.mp4", + /*normal*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.hq.mp4", + /*hd*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.hd.mp4", + /*ADsmall*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.ln.mp4", + /*ADnormal*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.hq.mp4", + /*ADhd*/ "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.hd.mp4", + /*DGSsmall*/ "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.ln.mp4", + /*DGSnormal*/ "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.hq.mp4", + /*DGShd*/ "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.hd.mp4", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:eaa2ed13a677cd00", + /*hd*/ GeoLocations.GEO_DE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.KIKA) }, { - "/ard/ard_film_page_with_related11.json", - "Live nach neun", - "Live nach Neun", - "", - LocalDateTime.of(2020, 7, 3, 9, 5, 0), - Duration.ofMinutes(49).plusSeconds(46), - "https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_640x360-25p-1300kbit.mp4", - "https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_960x540-50p-2600kbit.mp4", - "https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_1920x1080-50p-8000kbit.mp4", - "https://www.ardmediathek.de/subtitle/410911", - GeoLocations.GEO_DE, - new ArdFilmInfoDto[] { - new ArdFilmInfoDto( - "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA", - ArdConstants.ITEM_URL - + "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA", - 0), - new ArdFilmInfoDto( - "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg", - ArdConstants.ITEM_URL - + "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg", - 0), - new ArdFilmInfoDto( - "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ", - ArdConstants.ITEM_URL - + "Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ", - 0) - }, - Optional.empty() + /*jsonFile*/ "/ard/ard_item_DGS_UT_AD.json", + /*topic*/ "Tatort", + /*title*/ "Der Fluch des Geldes (mit Gebärdensprache)", + /*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.....", + /*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", + /*normal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_960x540-50p-1600kbit.mp4", + /*hd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_1280x720-50p-3200kbit.mp4", + /*ADsmall*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_640x360-50p-1200kbit.mp4", + /*ADnormal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_960x540-50p-1600kbit.mp4", + /*ADhd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_1280x720-50p-3200kbit.mp4", + /*DGSsmall*/ "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_640x360-50p-1200kbit.mp4", + /*DGSnormal*/ "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_960x540-50p-1600kbit.mp4", + /*DGShd*/ "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_1280x720-50p-3200kbit.mp4", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:7b0043ec0b358eb8.vtt", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[] { + new ArdFilmInfoDto( + "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ"), + 0), + new ArdFilmInfoDto( + "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5"), + 0) + }, + /*sender*/ Optional.of(Sender.ARD) }, { - "/ard/ard_film_page_ndr11.json", - "Wer weiß denn sowas? | 03.07.2020", - "Wer weiß denn sowas? | 03.07.2020", - "Das beliebte Wissensspiel mit Bernhard Hoëcker und Elton. Moderator Kai Pflaume präsentiert unglaubliche Rätselfragen. Welches Team gewinnt? Gäste: Hardy Krüger jr. und Oliver Masucci.", - LocalDateTime.of(2020, 7, 3, 16, 25, 0), - Duration.ofMinutes(44).plusSeconds(14), - "https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.ln.mp4", - "https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.hq.mp4", - "https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.hd.mp4", - "https://www.ardmediathek.de/subtitle/411033", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.of(Sender.NDR) + /*jsonFile*/ "/ard/ard_item_STD_BR.json", + /*topic*/ "PULS Reportage", + /*title*/ "Van-Urlaub für 1 Euro: Wie geht das?", + /*description*/ "Bei einer Relocation kann man sich für 1 Euro einen Mietwagen ausleihen und muss ihn dafür nur pünktlich zum nächsten Abholort bringen. Leah mietet sich einen Luxus-Van, mit dem sie in drei Tagen nach Italien fährt: Taugt's wirklich als Urlaub?", + /*date*/ LocalDateTime.parse("2024-05-01T15:00"), + /*duration*/ Duration.parse("PT20M47S"), + /*small*/ "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_E.mp4", + /*normal*/ "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_C.mp4", + /*hd*/ "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_X.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[] { + new ArdFilmInfoDto( + "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw"), + 0) + }, + /*sender*/ Optional.of(Sender.BR) }, { - "/ard/ard_film_page_funk.json", - "maiLab", - "Spieltheorie des Lebens | Tragödie des Gemeinguts", - "Dinge, von denen alle was haben, um die sich aber auch alle kümmern müssen, werden meist scheiße behandelt. Warum ist das so? Und muss das wirklich immer so sein?", - LocalDateTime.of(2019, 6, 19, 0, 0, 0), - Duration.ofMinutes(14).plusSeconds(27), - "", - "http://funk-01dd.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src_1024x576_1500.mp4", - "http://funk-01dd.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src_1920x1080_6000.mp4", - "", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.of(Sender.FUNK) + /*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.....", + /*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", + /*normal*/ "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webl.h264.mp4", + /*hd*/ "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webxl.h264.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:c09c9cee3bf53db8.vtt", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[] { + new ArdFilmInfoDto( + "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + String.format(ArdConstants.ITEM_URL, "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw"), + 0) + }, + /*sender*/ Optional.of(Sender.ARD), }, { - "/ard/ard_film_page_arte_geo.json", - "ARTE", - "Der Sommer nach dem Abitur", - "Nach dem Abitur wollten die drei Schulfreunde Alexander, Paul und Ole auf ein Konzert ihrer Lieblingsband Madness. Doch irgendetwas kam für alle dazwischen. Zu ihrem Glück gibt es die Band immer noch und so machen sie sich ein Vierteljahrhundert später auf den Weg ... - Tragikomödie (2019, Regie: Eoin Moore) über Lebenslügen, verpasste Träume und Existenzängste.", - LocalDateTime.of(2021, 6, 18, 5, 0, 0), - Duration.ofMinutes(88).plusSeconds(29), - "https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_HQ_1_VOA_05911353_MP4-800_AMM-IPTV-ARD_1ZbnJfgtHA.mp4", - "https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_EQ_1_VOA_05911351_MP4-1500_AMM-IPTV-ARD_1ZbnIfgtFZ.mp4", - "https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_SQ_1_VOA_05911354_MP4-2200_AMM-IPTV-ARD_1ZbnKfgtJr.mp4", - "", - GeoLocations.GEO_DE_FR, - new ArdFilmInfoDto[0], - Optional.empty() + /*jsonFile*/ "/ard/ard_item_STD_HR.json", + /*topic*/ "hallo hessen", + /*title*/ "hallo hessen – Teil 1 vom 30.04.2024", + /*description*/ "Der Mai steht vor der Tür und wir haben für Sie die perfekten Wandertipps. Los geht es heute mit dem herrlichen Rheingau. Außerdem wollen wir passend dazu auch die Grillsaison eröffnen. Und ein hessischer Erdbeerbauer verrät uns alles Wissenswerte um die roten Superfrüchtchen.", + /*date*/ LocalDateTime.parse("2024-04-30T16:00"), + /*duration*/ Duration.parse("PT46M"), + /*small*/ "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_640x360-50p-1200kbit.mp4", + /*normal*/ "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_960x540-50p-1600kbit.mp4", + /*hd*/ "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_1280x720-50p-3200kbit.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.HR), }, { - "/ard/ard_film_page_encoding_nbsp.json", - "Die Stein", - "Folge 8: Neues Glück (S01/E08)", - "Karola hat ein Stipendium für Italien bekommen. Aufgeregt ruft sie Katja an, die gerade mit Stefan ausreitet. Als Katja mit Stefan im Atelier erscheint, bricht Karola plötzlich zusammen. In der Klinik stellt sich heraus: Karola ist schwanger. Und alles spricht dafür, dass Oliver der Vater ist. Katja ist niedergeschlagen, hat sie doch ihr gemeinsames Kind damals verloren. Aber auch Karola ist kreuz\n.....", - LocalDateTime.of(2021, 10, 28, 17, 0, 0), - Duration.ofMinutes(47).plusSeconds(57), - "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488364.mp4", - "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488365.mp4", - "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488366.mp4", - "", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.of(Sender.ONE) + /*jsonFile*/ "/ard/ard_item_STD_NDR.json", + /*topic*/ "NDR Info", + /*title*/ "NDR Info 14:00 | 30.04.2024", + /*description*/ "Die Nachrichten für den Norden: Suche nach Arian eingestellt / Viele Pflege-Ausbildungsplätze in Schleswig-Holstein unbesetzt", + /*date*/ LocalDateTime.parse("2024-04-30T14:00"), + /*duration*/ Duration.parse("PT10M19S"), + /*small*/ "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.ln.mp4", + /*normal*/ "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.hq.mp4", + /*hd*/ "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.hd.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:ea9ad6b71df1b8ed.vtt", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.NDR), }, { - "/ard/ard_film_page_uhd.json", - "Leeroy will's wissen", - "Wie ist das DOWN-SYNDROM ZU HABEN?", - "Tamara ist 26 Jahre alt und hat das Down-Syndrom. Doch das ist für sie kein Hindernis – ganz im Gegenteil! Seit Jahren ist sie als Model und Schauspielerin sehr erfolgreich. So stand sie schon für die Designer Hugo Boss und Victoria Beckham vor der Kamera", - LocalDateTime.of(2022, 7, 24, 20, 0, 0), - Duration.ofMinutes(15).plusSeconds(50), - "https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/4-q4xvKF6nmVLY7Pw8Ckr9.mp4", - "https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/2-M7wvJWnjNmgfBGCLDYZV.mp4", - "https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/1-dz73ZV4wXPrfK8YDMBxj.mp4", - "", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.of(Sender.FUNK) + /*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.....", + /*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", + /*normal*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089637.mp4", + /*hd*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089638.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:0567b031db73e4b9.vtt", + /*hd*/ GeoLocations.GEO_DE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.ONE), }, { - "/ard/ard_film_page_only_single_resolution.json", - "Planet Schule", - "Der Spargel · Feldküche: Vom Acker direkt in den Topf", - "Spargelernte ist Knochenarbeit! Das erlebt auch Tom bei Landwirtin Regina Rothkopf und ihrem Sohn Maximilian in Euskirchen. Ob grün oder weiß, die Stangen sind der Spross der Spargelpflanze und ein gesundes Frühlingsgemüse. Zusammen mit Maximilian brät Tom am Feldrand aus dem frisch geernteten Spargel ein schnelles Pfannengericht.", - LocalDateTime.of(2023, 2, 10, 5, 30, 0), - Duration.ofMinutes(10), - "https://odplanetschule-a.akamaihd.net/schulfernsehen/feldkueche/feldkueche-vom-acker-direkt-in-den-topf-spargel.mp4", - "", - "", - "https://api.ardmediathek.de/subtitle-format-service/ebutt/urn:ard:subtitle:1090d019e4f165e1", - GeoLocations.GEO_NONE, - new ArdFilmInfoDto[0], - Optional.of(Sender.SWR) + /*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.....", + /*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", + /*normal*/ "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc540.mp4", + /*hd*/ "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc720.mp4", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.RBB), + }, + { + /*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.....", + /*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", + /*normal*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955170.mp4", + /*hd*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955171.mp4", + /*ADsmall*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101825.mp4", + /*ADnormal*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101826.mp4", + /*ADhd*/ "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101827.mp4", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:a1d11ac623c7d120.vtt", + /*hd*/ GeoLocations.GEO_NONE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.ARD), + }, + { + /*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.....", + /*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", + /*normal*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-730aae549c28_a6.mp4", + /*hd*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-be7c2950aac6_a6.mp4", + /*ADsmall*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-41dd60577440_25.mp4", + /*ADnormal*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-730aae549c28_25.mp4", + /*ADhd*/ "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-be7c2950aac6_25.mp4", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:7d1c01087f8cae77", + /*hd*/ GeoLocations.GEO_DE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.MDR), + }, + { + /*jsonFile*/ "/ard/ard_item_STD_AD_SWR.json", + /*topic*/ "Traumziele", + /*title*/ "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + /*description*/ "Der Apennin ist das Rückgrat und die Seele Italiens. Orte voller Geschichte und wilde Natur prägen das Land.", + /*date*/ LocalDateTime.parse("2024-05-01T14:15"), + /*duration*/ Duration.parse("PT43M55S"), + /*small*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.ml.mp4", + /*normal*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.l.mp4", + /*hd*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.xl.mp4", + /*ADsmall*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.ml.mp4", + /*ADnormal*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.l.mp4", + /*ADhd*/ "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.xl.mp4", + /*DGSsmall */ "", + /*DGSnormal */ "", + /*DGShd */ "", + /*sub*/ "", + /*hd*/ GeoLocations.GEO_DE, + /*related*/ new ArdFilmInfoDto[0], + /*sender*/ Optional.of(Sender.SWR), } }); } @@ -228,6 +360,7 @@ public void test() { assertThat(actualFilms.size(), equalTo(expectedFilmCount)); final ArdFilmDto[] films = actualFilms.toArray(new ArdFilmDto[] {}); + //AssertFilm.toTestCase("", films[0].getFilm()) AssertFilm.assertEquals( films[0].getFilm(), additionalSender.orElse(Sender.ARD), @@ -236,11 +369,17 @@ public void test() { expectedDateTime, expectedDuration, expectedDescription, - "", + "", // website new GeoLocations[] {expectedGeo}, expectedUrlSmall, expectedUrlNormal, expectedUrlHd, + expectedDGSUrlSmall, + expectedDGSUrlNormal, + expectedDGSUrlHd, + expectedADUrlSmall, + expectedADUrlNormal, + expectedADUrlHd, expectedSubtitle); assertThat(films[0].getRelatedFilms(), Matchers.containsInAnyOrder(relatedFilms)); } 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 58be10278..cac3686aa 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 @@ -14,6 +14,9 @@ import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; @@ -24,8 +27,8 @@ @RunWith(Parameterized.class) public class ArdFilmDetailTaskTest extends ArdTaskTestBase { - private final String filmUrl; - private final String filmJsonFile; + private final Map urlStub; + private final String crawlerUrl; private final String expectedTopic; private final String expectedTitle; private final LocalDateTime expectedTime; @@ -35,28 +38,36 @@ public class ArdFilmDetailTaskTest extends ArdTaskTestBase { private final String expectedUrlSmall; private final String expectedUrlNormal; private final String expectedUrlHd; + private final String expectedADUrlSmall; + private final String expectedADUrlNormal; + private final String expectedADUrlHd; private final String expectedSubtitle; private final GeoLocations expectedGeo; private final String id; - + private final Sender sender; + public ArdFilmDetailTaskTest( final String aId, - final String aFilmUrl, - final String aFilmJsonFile, + final String aCrawlerUrl, + final Map aUrlStub, final String aExpectedTopic, final String aExpectedTitle, + final String aExpectedDescription, final LocalDateTime aExpectedTime, final Duration aExpectedDuration, - final String aExpectedDescription, - final String aExpectedWebsite, final String aExpectedUrlSmall, final String aExpectedUrlNormal, final String aExpectedUrlHd, + final String aExpectedADUrlSmall, + final String aExpectedADUrlNormal, + final String aExpectedADUrlHd, final String aExpectedSubtitle, - final GeoLocations aExpectedGeo) { + final GeoLocations aExpectedGeo, + final String aExpectedWebsite, + final Sender aSender) { id = aId; - filmUrl = aFilmUrl; - filmJsonFile = aFilmJsonFile; + crawlerUrl = aCrawlerUrl; + urlStub = aUrlStub; expectedTopic = aExpectedTopic; expectedTitle = aExpectedTitle; expectedTime = aExpectedTime; @@ -66,8 +77,12 @@ public ArdFilmDetailTaskTest( expectedUrlSmall = aExpectedUrlSmall; expectedUrlNormal = aExpectedUrlNormal; expectedUrlHd = aExpectedUrlHd; + expectedADUrlSmall = aExpectedADUrlSmall; + expectedADUrlNormal = aExpectedADUrlNormal; + expectedADUrlHd = aExpectedADUrlHd; expectedSubtitle = aExpectedSubtitle; expectedGeo = aExpectedGeo; + sender = aSender; } @Parameters @@ -75,36 +90,47 @@ public static Collection data() { return Arrays.asList( new Object[][] { { - "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi", - "/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi", - "/ard/ard_film_page11.json", - "Tagesschau", - "tagesschau, 09:00 Uhr", - LocalDateTime.of(2020, 7, 3, 9, 0, 0), - Duration.ofMinutes(4).plusSeconds(9), - "Themen der Sendung: Bundestag und Bundesrat stimmen über Kohleausstieg ab, Werbeverbot für Tabak wird verschärft, Großbritannien lockert Corona-Einreisebeschränkungen, Zahl der Corona-Neuinfektionen in den USA erreicht neuen Höchststand, Urteil im Prozess gegen Menschenrechtler Steudtner in Istanbul erwartet, Hongkonger Bürgerrechtsaktivist bittet Deutschland um Hilfe für die Demokratie-Bewegung, \n.....", - "https://www.ardmediathek.de/video/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webml.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webl.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webxl.h264.mp4", - "https://www.ardmediathek.de/subtitle/410890", - GeoLocations.GEO_NONE, + /* id */ "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE", + /* crawlerUrl */ "/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE", + /* stup*/ Map.ofEntries( + Map.entry("/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE", "/ard/ard_item_fallback.json"), + Map.entry("/22679/files/21/01/30/2678992/22679-jqh9gFKRm8YDnC2.ism/manifest.m3u8", "/ard/ard_item_fallback_m3u.txt") + ), + /*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.....", + /*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=128019-video=327000.m3u8", + /*normal*/ "http://localhost:50998/22679/files/21/01/30/2678992/22679-jqh9gFKRm8YDnC2.ism/22679-jqh9gFKRm8YDnC2-audio=152016-video=1484000.m3u8", + /*hd*/ "http://localhost:50998/22679/files/21/01/30/2678992/22679-jqh9gFKRm8YDnC2.ism/22679-jqh9gFKRm8YDnC2-audio=152016-video=3883000.m3u8", + /*ADsmall*/ "", + /*ADnormal*/ "", + /*ADhd*/ "", + /*sub*/ "", + /*hd*/ GeoLocations.GEO_NONE, + /* website */ "https://www.ardmediathek.de/video/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE", + /* sender */ Sender.FUNK } }); } @Test public void test() { - setupSuccessfulJsonResponse(filmUrl, filmJsonFile); + + for (Entry entry : urlStub.entrySet()) { + setupSuccessfulJsonResponse(entry.getKey(), entry.getValue()); + } - final Set actual = executeTask(filmUrl); + final Set actual = executeTask(crawlerUrl); assertThat(actual.size(), equalTo(1)); final Film film = actual.iterator().next(); + AssertFilm.toTestCase(crawlerUrl, film); AssertFilm.assertEquals( film, - Sender.ARD, + sender, expectedTopic, expectedTitle, expectedTime, @@ -115,6 +141,10 @@ public void test() { expectedUrlSmall, expectedUrlNormal, expectedUrlHd, + "","","", // sign language + expectedADUrlSmall, + expectedADUrlNormal, + expectedADUrlHd, expectedSubtitle); } diff --git a/src/test/resources/ard/ard_film_page11.json b/src/test/resources/ard/ard_film_page11.json deleted file mode 100644 index 0dbaff1bf..000000000 --- a/src/test/resources/ard/ard_film_page11.json +++ /dev/null @@ -1,285 +0,0 @@ -{ - "fskRating":"NONE", - "id":"1m0kFcyvowSiEYW4c6YYWg", - "personalized":false, - "links":{ - "self":{ - "id":"1m0kFcyvowSiEYW4c6YYWg", - "title":"Ondemand PlayerPage ARD", - "href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi?embedded=true", - "type":"application/vnd.ard.page+json" - - } - - }, - "title":"tagesschau, 09:00 Uhr", - "tracking":{ - "aggregationLevelId":38, - "atiCustomVars":{ - "clipTitle":"tagesschau, 09:00 Uhr", - "mediaType":"video", - "lra":"Das Erste", - "channel":"Das Erste", - "show":"Tagesschau", - "contentTypes":"UT", - "mediaDistributionType":1, - "contentId":77387418, - "metadataId":"crid://daserste.de/tagesschau/a46824b7-58e3-485b-8339-72512e29680b", - "clipLength":249 - - }, - "chapter2":"Player", - "chapter3":"Tagesschau", - "environmentId":511893, - "pageTitle":"Mediathek/Player/Tagesschau/tagesschau, 09:00 Uhr/77387418/20200703_0700", - "szmType":"CP" - - }, - "widgets":[ - { - "availableTo":"2020-07-10T07:14:16Z", - "blockedByFsk":false, - "broadcastedOn":"2020-07-03T07:00:00Z", - "embeddable":true, - "geoblocked":false, - "id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi", - "image":{ - "alt":"Sendungsbild", - "producerName":"ARD-Standbild", - "src":"https://img.ardmediathek.de/standard/00/77/38/74/22/-1774185891/16x9/{width}?mandant=ard", - "title":"tagesschau, 09:00 Uhr - Standbild" - - }, - "maturityContentRating":"NONE", - "mediaCollection":{ - "embedded":{ - "_type":"video", - "_isLive":false, - "_defaultQuality":[ - "auto", - 2, - 4, - 3, - 1, - 0 - - ], - "_previewImage":"https://img.ardmediathek.de/standard/00/77/38/74/22/-1774185891/16x9/960?mandant=ard", - "_subtitleUrl":"https://www.ardmediathek.de/subtitle/410890", - "_subtitleOffset":0, - "_mediaArray":[ - { - "_plugin":1, - "_mediaStreamArray":[ - { - "_quality":"auto", - "_server":"", - "_cdn":"flashls", - "_stream":"https://hlstagesschau-vh.akamaihd.net/i/video/2020/0703/TV-20200703-0912-2800.,webs,websm,webm,webml,webl,webxl,.h264.mp4.csmil/master.m3u8" - - }, - { - "_quality":0, - "_server":"", - "_cdn":"default", - "_stream":"https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webs.h264.mp4" - - }, - { - "_quality":1, - "_stream":[ - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webml.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webm.h264.mp4", - "https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.websm.h264.mp4", - "https://download.media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.websm.h264.mp4" - - ] - - }, - { - "_quality":2, - "_server":"", - "_cdn":"default", - "_width":960, - "_height":540, - "_stream":"https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webl.h264.mp4" - - }, - { - "_quality":3, - "_server":"", - "_cdn":"default", - "_width":1280, - "_height":720, - "_stream":"https://media.tagesschau.de/video/2020/0703/TV-20200703-0912-2800.webxl.h264.mp4" - - } - - ] - - } - - ], - "_alternativeMediaArray":[ - - - ], - "_sortierArray":[ - 1 - - ], - "_duration":249, - "_dvrEnabled":false, - "_geoblocked":false - - }, - "href":"http://api.ardmediathek.de/page-gateway/mediacollection/77387418?devicetype={devicetype}" - - }, - "pagination":null, - "personalized":false, - "playerConfig":{ - "embedded":{ - "_baseUrl":"/ard/static/player/", - "_baseAssetUrl":"/ard/static/player/base/", - "_autoplay":"FORCE", - "_showSubtitelAtStart":false, - "_addons":[ - "AddonUntertitel_ebu_tt" - - ], - "_solaAnalyticsEnabled":true, - "_solaAnalyticsConfig":"/play/sola/77387418", - "_pixelConfig":[ - { - "tracker":"AGF", - "clipUrl":"https://hlstagesschau-vh.akamaihd.net/i/video/2020/0703/TV-20200703-0912-2800.,webs,websm,webm,webml,webl,webxl,.h264.mp4.csmil/master.m3u8", - "clipType":"content", - "agfVCID":"b02", - "agfMetadata":"https://www.ardmediathek.de/goto/tv/77387418249Das Erste_Tagesschau_tagesschau, 09:00 Uhr_03.07.2020 09:00nop2,Np5,ARD Mediathekp7,crid://daserste.de/tagesschau/a46824b7-58e3-485b-8339-72512e29680bp8,249p9,Tagesschau_tagesschau, 09:00 Uhr_03.07.2020 09:00p10,Das Erstep12,Contentp18,Np19,ARD-Aktuell", - "agfClipLength":"249", - "agfGlobalParamsSDK":{ - "clientid":"de-605508", - "apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5", - "sfcode":"eu", - "prod":"vc", - "vcid":"b02", - "apn":"ARD Mediathek" - - }, - "agfMetaDataSDK":{ - "assetid":"https://hlstagesschau-vh.akamaihd.net/i/video/2020/0703/TV-20200703-0912-2800.,webs,websm,webm,webml,webl,webxl,.h264.mp4.csmil/master.m3u8", - "type":"content", - "program":"Tagesschau", - "title":"Das Erste_Tagesschau_tagesschau, 09:00 Uhr_03.07.2020 09:00", - "length":"249", - "livestream":"no", - "uurl":"https://www.ardmediathek.de/goto/tv/77387418", - "nol_c2":"p2,N", - "nol_c5":"p5,ARD Mediathek", - "nol_c7":"p7,crid://daserste.de/tagesschau/a46824b7-58e3-485b-8339-72512e29680b", - "nol_c8":"p8,249", - "nol_c9":"p9,Tagesschau_tagesschau, 09:00 Uhr_03.07.2020 09:00", - "nol_c10":"p10,Das Erste", - "nol_c12":"p12,Content", - "nol_c18":"p18,N", - "nol_c19":"p19,ARD-Aktuell" - - } - - }, - { - "tracker":"ATI", - "x3":"video", - "x5":"Das+Erste", - "x6":"Das+Erste", - "x7":"Tagesschau", - "x8":"6", - "x9":"ARD-Aktuell", - "x10":"1", - "x14":"77387418", - "x20":"249", - "clipUrl":"https://hlstagesschau-vh.akamaihd.net/i/video/2020/0703/TV-20200703-0912-2800.,webs,websm,webm,webml,webl,webxl,.h264.mp4.csmil/master.m3u8", - "clipTitle":"tagesschau, 09:00 Uhr", - "countingUrl":"/ard/servlet/count/77387418" - - } - - ] - - }, - "href":"http://api.ardmediathek.de/page-gateway/playerconfig/77387418" - - }, - "publicationService":{ - "name":"Das Erste", - "logo":{ - "title":"DasErste", - "alt":"DasErste", - "producerName":"ARD", - "src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard", - "aspectRatio":"0" - - }, - "publisherType":"TV", - "partner":"das_erste", - "id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ" - - }, - "links":{ - "self":{ - "id":"5kG69Jms5UMSSUMwMCY0k0", - "title":"Player Widget ARD", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi?pageNumber=0&pageSize=100&embedded=true", - "type":"application/vnd.ard.widget+json" - - } - - }, - "show":{ - "id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", - "title":"Tagesschau", - "image":{ - "alt":"tagesschau", - "producerName":"tagesschau", - "src":"https://img.ardmediathek.de/standard/00/07/64/05/74/2121327408/16x9/{width}?mandant=ard", - "title":"tagesschau, 07:00 Uhr - Standbild" - - } - - }, - "synopsis":"Themen der Sendung: Bundestag und Bundesrat stimmen über Kohleausstieg ab, Werbeverbot für Tabak wird verschärft, Großbritannien lockert Corona-Einreisebeschränkungen, Zahl der Corona-Neuinfektionen in den USA erreicht neuen Höchststand, Urteil im Prozess gegen Menschenrechtler Steudtner in Istanbul erwartet, Hongkonger Bürgerrechtsaktivist bittet Deutschland um Hilfe für die Demokratie-Bewegung, Relegations-Hinspiel der Fußball Bundesliga, Das Wetter", - "title":"tagesschau, 09:00 Uhr", - "type":"player_ondemand" - - }, - { - "compilationType":"itemsOfShow", - "id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", - "pagination":{ - "pageNumber":0, - "pageSize":24, - "totalElements":2417 - - }, - "personalized":false, - "links":{ - "self":{ - "id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", - "title":"Tagesschau", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU?excludedAssetIds=Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXUvYTQ2ODI0YjctNThlMy00ODViLTgzMzktNzI1MTJlMjk2ODBi&pageNumber=0&pageSize=24&embedded=true", - "type":"application/vnd.ard.widget+json" - - } - - }, - "size":"m", - "swipeable":true, - "title":"Tagesschau", - "titleVisible":true, - "type":"gridlist" - - } - - ] -} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_arte_geo.json b/src/test/resources/ard/ard_film_page_arte_geo.json deleted file mode 100644 index 2f185add3..000000000 --- a/src/test/resources/ard/ard_film_page_arte_geo.json +++ /dev/null @@ -1 +0,0 @@ -{"fskRating":"FSK0","id":"1m0kFcyvowSiEYW4c6YYWg","isChildContent":false,"personalized":false,"links":{"self":{"id":"1m0kFcyvowSiEYW4c6YYWg","urlId":"1m0kFcyvowSiEYW4c6YYWg","title":"Ondemand PlayerPage ARD","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ?devicetype=pc&embedded=false","type":"application/vnd.ard.page+json","partner":"ard"}},"title":"Der Sommer nach dem Abitur","tracking":{"aggregationLevelId":38,"atiCustomVars":{"clipTitle":"Der Sommer nach dem Abitur","mediaType":"video","lra":"ARTE","channel":"ARTE","show":"ARTE","contentTypes":"","mediaDistributionType":1,"contentId":90259952,"metadataId":"crid://arte.tv/videos/084657-000-A","clipLength":5309},"chapter2":"Player","chapter3":"ARTE","environmentId":511893,"pageTitle":"Mediathek/Player/ARTE/Der Sommer nach dem Abitur/90259952/20210618_0300","szmType":"CP"},"widgets":[{"availableTo":"2021-06-25T03:00:00Z","blockedByFsk":false,"broadcastedOn":"2021-06-18T03:00:00Z","embeddable":false,"geoblocked":false,"id":"Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ","image":{"alt":"Der Sommer nach dem Abitur","producerName":"ARTE","src":"https://img.ardmediathek.de/standard/00/90/25/99/56/-1774185891/16x9/{width}?mandant=ard","title":"Der Sommer nach dem Abitur - Standbild"},"isChildContent":false,"maturityContentRating":"FSK0","mediaCollection":{"embedded":{"_type":"video","_isLive":false,"_defaultQuality":["auto",2,4,3,1,0],"_previewImage":"https://img.ardmediathek.de/standard/00/90/25/99/56/-1774185891/16x9/960?mandant=ard","_subtitleOffset":0,"_mediaArray":[{"_plugin":1,"_mediaStreamArray":[{"_quality":"auto","_server":"","_cdn":"flashls","_stream":"https://arte-ard-mediathek-hls.akamaized.net/am/cmaf/084000/084600/084657-000-A/210616070902/084657-000-A_VOA_XQ.m3u8"},{"_quality":0,"_server":"","_cdn":"akamai","_stream":"https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_MQ_1_VOA_05911350_MP4-300_AMM-IPTV-ARD_1ZbnHfgtIH.mp4"},{"_quality":1,"_server":"","_cdn":"akamai","_width":640,"_height":360,"_stream":"https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_HQ_1_VOA_05911353_MP4-800_AMM-IPTV-ARD_1ZbnJfgtHA.mp4"},{"_quality":2,"_server":"","_cdn":"akamai","_width":960,"_height":540,"_stream":"https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_EQ_1_VOA_05911351_MP4-1500_AMM-IPTV-ARD_1ZbnIfgtFZ.mp4"},{"_quality":3,"_server":"","_cdn":"akamai","_width":1280,"_height":720,"_stream":"https://arte-ard-mediathek.akamaized.net/am/mp4/084000/084600/084657-000-A_SQ_1_VOA_05911354_MP4-2200_AMM-IPTV-ARD_1ZbnKfgtJr.mp4"}]}],"_alternativeMediaArray":[],"_sortierArray":[1],"_duration":5309,"_dvrEnabled":false,"_geoblocked":false},"href":"https://api.ardmediathek.de/page-gateway/mediacollection/Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ?devicetype=pc"},"pagination":null,"personalized":false,"playerConfig":{"embedded":{"_baseUrl":"/ard/static/player/","_baseAssetUrl":"/ard/static/player/base/","_autoplay":"FORCE","_showSubtitelAtStart":false,"_solaAnalyticsEnabled":true,"_solaAnalyticsConfig":"/play/sola/90259952","_pixelConfig":[{"tracker":"AGF","clipUrl":"https://arte-ard-mediathek-hls.akamaized.net/am/cmaf/084000/084600/084657-000-A/210616070902/084657-000-A_VOA_XQ.m3u8","clipType":"content","agfVCID":"b02","agfMetadata":"https://www.ardmediathek.de/goto/tv/902599525309ARTE_ARTE_Der Sommer nach dem Abitur_18.06.2021 05:00nop2,Np5,ARD Mediathekp7,crid://arte.tv/videos/084657-000-Ap8,5309p9,ARTE_Der Sommer nach dem Abitur_18.06.2021 05:00p10,ARTEp12,Contentp18,Np19,ARTE Kirsten Ellerbrake Tanja Ziegler","agfClipLength":"5309","agfGlobalParamsSDK":{"clientid":"de-605508","apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5","sfcode":"eu","prod":"vc","vcid":"b02","apn":"ARD Mediathek"},"agfMetaDataSDK":{"assetid":"https://arte-ard-mediathek-hls.akamaized.net/am/cmaf/084000/084600/084657-000-A/210616070902/084657-000-A_VOA_XQ.m3u8","type":"content","program":"ARTE","title":"ARTE_ARTE_Der Sommer nach dem Abitur_18.06.2021 05:00","length":"5309","livestream":"no","uurl":"https://www.ardmediathek.de/goto/tv/90259952","nol_c2":"p2,N","nol_c5":"p5,ARD Mediathek","nol_c7":"p7,crid://arte.tv/videos/084657-000-A","nol_c8":"p8,5309","nol_c9":"p9,ARTE_Der Sommer nach dem Abitur_18.06.2021 05:00","nol_c10":"p10,ARTE","nol_c12":"p12,Content","nol_c18":"p18,N","nol_c19":"p19,ARTE Kirsten Ellerbrake Tanja Ziegler"}},{"tracker":"ATI","x3":"video","x5":"ARTE","x6":"ARTE","x7":"ARTE","x8":"1","x9":"ARTE+Kirsten+Ellerbrake+Tanja+Ziegler","x10":"1","x14":"90259952","x20":"5309","clipUrl":"https://arte-ard-mediathek-hls.akamaized.net/am/cmaf/084000/084600/084657-000-A/210616070902/084657-000-A_VOA_XQ.m3u8","clipTitle":"Der Sommer nach dem Abitur","countingUrl":"/ard/servlet/count/90259952"}]},"href":"https://api.ardmediathek.de/page-gateway/playerconfig/Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ"},"publicationService":{"name":"ARTE","logo":{"title":"ARTE","alt":"ARTE","producerName":"ARTE","src":"https://img.ardmediathek.de/standard/00/21/51/89/18/555337067/16x9/{width}?mandant=ard","aspectRatio":"16x9"},"publisherType":"TV","partner":"arte","id":"b3JnYW5pemF0aW9uX0FSVEU"},"links":{"self":{"id":"5kG69Jms5UMSSUMwMCY0k0","urlId":"5kG69Jms5UMSSUMwMCY0k0","title":"Player Widget ARD","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ?pageNumber=0&pageSize=100&embedded=false","type":"application/vnd.ard.widget+json","partner":"ard"}},"show":{"id":"Y3JpZDovL2FydGUudHYvYXJ0ZQ","title":"ARTE","image":{"alt":"The European Collection","producerName":"ARTE","src":"https://img.ardmediathek.de/standard/00/88/44/31/72/-1774185891/16x9/{width}?mandant=ard","title":"ARTE - Bevorzugt"}},"synopsis":"Nach dem Abitur wollten die drei Schulfreunde Alexander, Paul und Ole auf ein Konzert ihrer Lieblingsband Madness. Doch irgendetwas kam für alle dazwischen. Zu ihrem Glück gibt es die Band immer noch und so machen sie sich ein Vierteljahrhundert später auf den Weg ... - Tragikomödie (2019, Regie: Eoin Moore) über Lebenslügen, verpasste Träume und Existenzängste.","title":"Der Sommer nach dem Abitur","type":"player_ondemand"},{"compilationType":"itemsOfShow","id":"Y3JpZDovL2FydGUudHYvYXJ0ZQ","isChildContent":false,"pagination":{"pageNumber":0,"pageSize":24,"totalElements":null},"personalized":false,"links":{"self":{"id":"Y3JpZDovL2FydGUudHYvYXJ0ZQ","urlId":"Y3JpZDovL2FydGUudHYvYXJ0ZQ","title":"ARTE","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2FydGUudHYvYXJ0ZQ?excludedAssetIds=Y3JpZDovL2FydGUudHYvdmlkZW9zLzA4NDY1Ny0wMDAtQQ&pageNumber=0&pageSize=24&embedded=false&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false","type":"application/vnd.ard.widget+json","partner":"ard"}},"size":"m","swipeable":true,"teasers":[],"title":"ARTE","titleVisible":true,"type":"gridlist"}]} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_encoding_nbsp.json b/src/test/resources/ard/ard_film_page_encoding_nbsp.json deleted file mode 100644 index 1f98ffb74..000000000 --- a/src/test/resources/ard/ard_film_page_encoding_nbsp.json +++ /dev/null @@ -1 +0,0 @@ -{"fskRating":"FSK0","id":"1m0kFcyvowSiEYW4c6YYWg","isChildContent":false,"personalized":false,"links":{"self":{"id":"1m0kFcyvowSiEYW4c6YYWg","urlId":"1m0kFcyvowSiEYW4c6YYWg","title":"Ondemand PlayerPage ARD","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ?embedded=true","type":"application/vnd.ard.page+json","partner":"ard"}},"title":"Folge 8: Neues Glück (S01/E08)","tracking":{"aggregationLevelId":38,"atiCustomVars":{"clipTitle":"Folge 8: Neues Glück (S01/E08)","mediaType":"video","lra":"ONE","channel":"ONE","show":"Die Stein","contentTypes":"","mediaDistributionType":1,"contentId":94177244,"metadataId":"crid://wdr.de/Beitrag-9b863ab2-f601-4450-8664-4c4c83d864ba","clipLength":2877},"chapter2":"Player","chapter3":"Die Stein","environmentId":511893,"pageTitle":"Mediathek/Player/Die Stein/Folge 8: Neues Glück (S01/E08)/94177244/20211028_1500","szmType":"CP"},"widgets":[{"availableTo":"2022-04-28T15:00:00Z","blockedByFsk":false,"broadcastedOn":"2021-10-28T15:00:00Z","embeddable":false,"geoblocked":false,"id":"Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ","image":{"alt":"Karola (Katja Studt, r.) erfährt im Krankenhaus, dass sie schwanger ist. Und alles spricht dafür, dass der Mann ihrer Schwester Katja (Julia Stemberger, l.) der Vater ihres Kindes ist.","producerName":"WDR","src":"https://img.ardmediathek.de/standard/00/94/17/72/52/-1774185891/16x9/{width}?mandant=ard","title":"Folge 8: Neues Glück (S01/E08) - Standbild"},"isChildContent":false,"maturityContentRating":"FSK0","mediaCollection":{"embedded":{"_type":"video","_isLive":false,"_defaultQuality":["auto",2,4,3,1,0],"_previewImage":"https://img.ardmediathek.de/standard/00/94/17/72/60/1663778729/16x9/960?mandant=ard","_subtitleOffset":0,"_mediaArray":[{"_plugin":1,"_mediaStreamArray":[{"_quality":"auto","_server":"","_cdn":"flashls","_stream":"//wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk0/255/2559347/,2559347_39488364,2559347_39488365,2559347_39488363,2559347_39488366,.mp4.csmil/master.m3u8"},{"_quality":0,"_server":"","_cdn":"akamai","_stream":"//wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488363.mp4"},{"_quality":1,"_server":"","_cdn":"akamai","_width":640,"_height":360,"_stream":"//wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488364.mp4"},{"_quality":2,"_server":"","_cdn":"akamai","_width":960,"_height":540,"_stream":"//wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488365.mp4"},{"_quality":3,"_server":"","_cdn":"akamai","_width":1280,"_height":720,"_stream":"//wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk0/255/2559347/2559347_39488366.mp4"}]}],"_alternativeMediaArray":[],"_sortierArray":[1],"_duration":2877,"_dvrEnabled":false,"_geoblocked":false},"href":"https://api.ardmediathek.de/page-gateway/mediacollection/Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ?devicetype=pc"},"pagination":null,"personalized":false,"playerConfig":{"embedded":{"_baseUrl":"/ard/static/player/","_baseAssetUrl":"/ard/static/player/base/","_autoplay":"FORCE","_showSubtitelAtStart":false,"_solaAnalyticsEnabled":true,"_solaAnalyticsConfig":"/play/sola/94177244","_pixelConfig":[{"tracker":"AGF","clipUrl":"//wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk0/255/2559347/,2559347_39488364,2559347_39488365,2559347_39488363,2559347_39488366,.mp4.csmil/master.m3u8","clipType":"content","agfVCID":"b02","agfMetadata":"https://www.ardmediathek.de/goto/tv/941772442877ONE_Die Stein_Folge 8: Neues Glück (S01/E08)_28.10.2021 17:00nop0,0p2,Np5,ARD Mediathekp7,crid://wdr.de/Beitrag-9b863ab2-f601-4450-8664-4c4c83d864bap8,2877p9,Die Stein_Folge 8: Neues Glück (S01/E08)_28.10.2021 17:00p10,ONEp12,Contentp15,258785p16,Unterhaltungp18,Np19,WDR","agfClipLength":"2877","agfGlobalParamsSDK":{"clientid":"de-605508","apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5","sfcode":"eu","prod":"vc","vcid":"b02","apn":"ARD Mediathek"},"agfMetaDataSDK":{"assetid":"//wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk0/255/2559347/,2559347_39488364,2559347_39488365,2559347_39488363,2559347_39488366,.mp4.csmil/master.m3u8","type":"content","program":"Die Stein","title":"ONE_Die Stein_Folge 8: Neues Glück (S01/E08)_28.10.2021 17:00","length":"2877","livestream":"no","uurl":"https://www.ardmediathek.de/goto/tv/94177244","nol_c0":"p0,0","nol_c2":"p2,N","nol_c5":"p5,ARD Mediathek","nol_c7":"p7,crid://wdr.de/Beitrag-9b863ab2-f601-4450-8664-4c4c83d864ba","nol_c8":"p8,2877","nol_c9":"p9,Die Stein_Folge 8: Neues Glück (S01/E08)_28.10.2021 17:00","nol_c10":"p10,ONE","nol_c12":"p12,Content","nol_c15":"p15,258785","nol_c16":"p16,Unterhaltung","nol_c18":"p18,N","nol_c19":"p19,WDR"}},{"tracker":"ATI","x3":"video","x5":"ONE","x6":"ONE","x7":"Die+Stein","x8":"1","x9":"WDR","x10":"1","x14":"94177244","x20":"2877","clipUrl":"//wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk0/255/2559347/,2559347_39488364,2559347_39488365,2559347_39488363,2559347_39488366,.mp4.csmil/master.m3u8","clipTitle":"Folge 8: Neues Glück (S01/E08)","countingUrl":"/ard/servlet/count/94177244"}]},"href":"https://api.ardmediathek.de/page-gateway/playerconfig/Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ"},"publicationService":{"name":"ONE","logo":{"title":"One","alt":"One","producerName":"One","src":"https://img.ardmediathek.de/standard/00/21/51/88/90/-295433861/16x9/{width}?mandant=ard","aspectRatio":"16x9"},"publisherType":"TV","partner":"one","id":"b3JnYW5pemF0aW9uX09ORQ"},"links":{"self":{"id":"5kG69Jms5UMSSUMwMCY0k0","urlId":"5kG69Jms5UMSSUMwMCY0k0","title":"Player Widget ARD","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ?pageNumber=0&pageSize=100&embedded=true","type":"application/vnd.ard.widget+json","partner":"ard"}},"show":{"id":"Y3JpZDovL3dkci5kZS9vbmUvZGllc3RlaW4","title":"Die Stein","image":{"alt":"Lehrerin Katja Stein","producerName":"ARD/Claudius Pflug","src":"https://img.ardmediathek.de/standard/00/93/72/66/44/-1774185891/16x9/{width}?mandant=ard","title":"Die Stein - Logo"}},"synopsis":"Karola hat ein Stipendium für Italien bekommen. Aufgeregt ruft sie Katja an, die gerade mit Stefan ausreitet. Als Katja mit Stefan im Atelier erscheint, bricht Karola plötzlich zusammen. In der Klinik stellt sich heraus: Karola ist schwanger. Und alles spricht dafür, dass Oliver der Vater ist. Katja ist niedergeschlagen, hat sie doch ihr gemeinsames Kind damals verloren. Aber auch Karola ist kreuzunglücklich. Sie will das Kind nicht.","title":"Folge 8: Neues Glück (S01/E08)","type":"player_ondemand"},{"compilationType":"itemsOfShow","id":"Y3JpZDovL3dkci5kZS9vbmUvZGllc3RlaW4","isChildContent":false,"pagination":{"pageNumber":0,"pageSize":24,"totalElements":8},"personalized":false,"links":{"self":{"id":"Y3JpZDovL3dkci5kZS9vbmUvZGllc3RlaW4","urlId":"Y3JpZDovL3dkci5kZS9vbmUvZGllc3RlaW4","title":"Die Stein","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3dkci5kZS9vbmUvZGllc3RlaW4?excludedAssetIds=Y3JpZDovL3dkci5kZS9CZWl0cmFnLTliODYzYWIyLWY2MDEtNDQ1MC04NjY0LTRjNGM4M2Q4NjRiYQ&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false","type":"application/vnd.ard.widget+json","partner":"ard"}},"size":"m","swipeable":true,"teasers":[],"title":"Die Stein","titleVisible":true,"type":"gridlist"}]} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_funk.json b/src/test/resources/ard/ard_film_page_funk.json deleted file mode 100644 index f3f3be97e..000000000 --- a/src/test/resources/ard/ard_film_page_funk.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "fskRating":"NONE", - "id":"1m0kFcyvowSiEYW4c6YYWg", - "personalized":false, - "links":{ - "self":{ - "id":"1m0kFcyvowSiEYW4c6YYWg", - "urlId":"1m0kFcyvowSiEYW4c6YYWg", - "title":"Ondemand PlayerPage ARD", - "href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0Lzk5Ni92aWRlby8xNzAwNDU4?embedded=true", - "type":"application/vnd.ard.page+json", - "partner":"ard" - } - }, - "title":"Spieltheorie des Lebens | Tragödie des Gemeinguts", - "tracking":{ - "aggregationLevelId":38, - "atiCustomVars":{ - "clipTitle":"Spieltheorie des Lebens | Tragödie des Gemeinguts", - "mediaType":"video", - "lra":"funk", - "channel":"funk", - "show":"maiLab", - "contentTypes":"", - "mediaDistributionType":1, - "contentId":81483340, - "metadataId":"crid://funk.net/996/video/1700458", - "clipLength":867 - }, - "chapter2":"Player", - "chapter3":"maiLab", - "environmentId":511893, - "pageTitle":"Mediathek/Player/maiLab/Spieltheorie des Lebens | Tragödie des Gemeinguts/81483340/20190618_2200", - "szmType":"CP" - }, - "widgets":[ - { - "availableTo":null, - "blockedByFsk":false, - "broadcastedOn":"2019-06-18T22:00:00Z", - "embeddable":false, - "geoblocked":false, - "id":"Y3JpZDovL2Z1bmsubmV0Lzk5Ni92aWRlby8xNzAwNDU4", - "image":{ - "alt":"Bild zur Sendung", - "producerName":"funk", - "src":"https://img.ardmediathek.de/standard/00/81/48/33/44/-1774185891/16x9/{width}?mandant=ard", - "title":"Spieltheorie des Lebens | Tragödie des Gemeinguts - Standbild" - }, - "maturityContentRating":"NONE", - "mediaCollection":{ - "embedded":{ - "_type":"video", - "_isLive":false, - "_defaultQuality":[ - "auto", - 2, - 4, - 3, - 1, - 0 - ], - "_previewImage":"https://img.ardmediathek.de/standard/00/81/48/33/44/-1774185891/16x9/960?mandant=ard", - "_subtitleOffset":0, - "_mediaArray":[ - { - "_plugin":1, - "_mediaStreamArray":[ - { - "_quality":"auto", - "_server":"", - "_cdn":"flashls", - "_stream":"https://funk-01.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src.ism/Manifest(format=m3u8-aapl-v3).m3u8" - }, - { - "_quality":2, - "_server":"", - "_cdn":"akamai", - "_width":960, - "_height":540, - "_stream":"http://funk-01dd.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src_1024x576_1500.mp4?fv=1" - }, - { - "_quality":4, - "_server":"", - "_cdn":"akamai", - "_width":1920, - "_height":1080, - "_stream":"http://funk-01dd.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src_1920x1080_6000.mp4?fv=1" - } - ] - } - ], - "_alternativeMediaArray":[ - - ], - "_sortierArray":[ - 1 - ], - "_duration":867, - "_dvrEnabled":false, - "_geoblocked":false - }, - "href":"http://api.ardmediathek.de/page-gateway/mediacollection/81483340?devicetype={devicetype}" - }, - "pagination":null, - "personalized":false, - "playerConfig":{ - "embedded":{ - "_baseUrl":"/ard/static/player/", - "_baseAssetUrl":"/ard/static/player/base/", - "_autoplay":"FORCE", - "_showSubtitelAtStart":false, - "_solaAnalyticsEnabled":true, - "_solaAnalyticsConfig":"/play/sola/81483340", - "_pixelConfig":[ - { - "tracker":"AGF", - "clipUrl":"https://funk-01.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src.ism/Manifest(format=m3u8-aapl-v3).m3u8", - "clipType":"content", - "agfVCID":"b02", - "agfMetadata":"https://www.ardmediathek.de/goto/tv/81483340867funk_maiLab_Spieltheorie des Lebens | Tragödie des Gemeinguts_19.06.2019 00:00nop0,0p2,Np5,ARD Mediathekp7,crid://funk.net/996/video/1700458p8,867p9,maiLab_Spieltheorie des Lebens | Tragödie des Gemeinguts_19.06.2019 00:00p10,funkp12,Contentp18,Np19,funk", - "agfClipLength":"867", - "agfGlobalParamsSDK":{ - "clientid":"de-605508", - "apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5", - "sfcode":"eu", - "prod":"vc", - "vcid":"b02", - "apn":"ARD Mediathek" - }, - "agfMetaDataSDK":{ - "assetid":"https://funk-01.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src.ism/Manifest(format=m3u8-aapl-v3).m3u8", - "type":"content", - "program":"maiLab", - "title":"funk_maiLab_Spieltheorie des Lebens | Tragödie des Gemeinguts_19.06.2019 00:00", - "length":"867", - "livestream":"no", - "uurl":"https://www.ardmediathek.de/goto/tv/81483340", - "nol_c0":"p0,0", - "nol_c2":"p2,N", - "nol_c5":"p5,ARD Mediathek", - "nol_c7":"p7,crid://funk.net/996/video/1700458", - "nol_c8":"p8,867", - "nol_c9":"p9,maiLab_Spieltheorie des Lebens | Tragödie des Gemeinguts_19.06.2019 00:00", - "nol_c10":"p10,funk", - "nol_c12":"p12,Content", - "nol_c18":"p18,N", - "nol_c19":"p19,funk" - } - }, - { - "tracker":"ATI", - "x3":"video", - "x5":"funk", - "x6":"funk", - "x7":"maiLab", - "x8":"1", - "x9":"funk", - "x10":"1", - "x14":"81483340", - "x20":"867", - "clipUrl":"https://funk-01.akamaized.net/06961997-44b3-4888-8f86-ad60286370ce/1700458_src.ism/Manifest(format=m3u8-aapl-v3).m3u8", - "clipTitle":"Spieltheorie des Lebens | Tragödie des Gemeinguts", - "countingUrl":"/ard/servlet/count/81483340" - } - ] - }, - "href":"http://api.ardmediathek.de/page-gateway/playerconfig/81483340" - }, - "publicationService":{ - "name":"funk", - "logo":{ - "title":"funk", - "alt":"funk", - "producerName":"SWR", - "src":"https://img.ardmediathek.de/standard/00/81/43/06/12/-1774185891/16x9/{width}?mandant=ard", - "aspectRatio":"16x9" - }, - "publisherType":"TV", - "partner":"funk", - "id":"b3JnYW5pemF0aW9uX2Z1bms" - }, - "links":{ - "self":{ - "id":"5kG69Jms5UMSSUMwMCY0k0", - "urlId":"5kG69Jms5UMSSUMwMCY0k0", - "title":"Player Widget ARD", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL2Z1bmsubmV0Lzk5Ni92aWRlby8xNzAwNDU4?pageNumber=0&pageSize=100&embedded=true", - "type":"application/vnd.ard.widget+json", - "partner":"ard" - } - }, - "show":{ - "id":"Y3JpZDovL2Z1bmsubmV0Lzk5Ng", - "title":"maiLab", - "image":{ - "alt":"Bild zur Sendereihe maiLab.", - "producerName":"funk", - "src":"https://img.ardmediathek.de/standard/00/81/45/66/78/-1774185891/16x9/{width}?mandant=ard", - "title":"maiLab - Bevorzugt" - } - }, - "synopsis":"Dinge, von denen alle was haben, um die sich aber auch alle kümmern müssen, werden meist scheiße behandelt. Warum ist das so? Und muss das wirklich immer so sein?", - "title":"Spieltheorie des Lebens | Tragödie des Gemeinguts", - "type":"player_ondemand" - }, - { - "compilationType":"itemsOfShow", - "id":"Y3JpZDovL2Z1bmsubmV0Lzk5Ng", - "pagination":{ - "pageNumber":0, - "pageSize":24, - "totalElements":128 - }, - "personalized":false, - "links":{ - "self":{ - "id":"Y3JpZDovL2Z1bmsubmV0Lzk5Ng", - "urlId":"Y3JpZDovL2Z1bmsubmV0Lzk5Ng", - "title":"maiLab", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Z1bmsubmV0Lzk5Ng?excludedAssetIds=Y3JpZDovL2Z1bmsubmV0Lzk5Ni92aWRlby8xNzAwNDU4&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false", - "type":"application/vnd.ard.widget+json", - "partner":"ard" - } - }, - "size":"m", - "swipeable":true, - "teasers":[], - "title":"maiLab", - "titleVisible":true, - "type":"gridlist" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_ndr11.json b/src/test/resources/ard/ard_film_page_ndr11.json deleted file mode 100644 index d750deddf..000000000 --- a/src/test/resources/ard/ard_film_page_ndr11.json +++ /dev/null @@ -1 +0,0 @@ -{"fskRating":"NONE","id":"1m0kFcyvowSiEYW4c6YYWg","personalized":false,"links":{"self":{"id":"1m0kFcyvowSiEYW4c6YYWg","title":"Ondemand PlayerPage ARD","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL25kci5kZS80YzE2ZWFlOC02YjY4LTQ4ZmMtYTdlNS0wMWFhYTY2OGMzYmM?embedded=true","type":"application/vnd.ard.page+json"}},"title":"Wer weiß denn sowas? | 03.07.2020","tracking":{"aggregationLevelId":38,"atiCustomVars":{"clipTitle":"Wer weiß denn sowas. | 03.07.2020","mediaType":"video","lra":"NDR","channel":"NDR Fernsehen","show":"Ohne Sendereihe","contentTypes":"UT","mediaDistributionType":1,"contentId":77407976,"metadataId":"crid://ndr.de/4c16eae8-6b68-48fc-a7e5-01aaa668c3bc","clipLength":2654},"chapter2":"Player","chapter3":null,"environmentId":511893,"pageTitle":"Mediathek/Player/Wer weiß denn sowas. | 03.07.2020/77407976/20200703_1425","szmType":"CP"},"widgets":[{"availableTo":"2020-07-10T14:25:00Z","blockedByFsk":false,"broadcastedOn":"2020-07-03T14:25:00Z","embeddable":false,"geoblocked":false,"id":"Y3JpZDovL25kci5kZS80YzE2ZWFlOC02YjY4LTQ4ZmMtYTdlNS0wMWFhYTY2OGMzYmM","image":{"alt":"Der Moderator Kai Pflaume.","producerName":"NDR","src":"https://img.ardmediathek.de/standard/00/77/40/79/80/-1774185891/16x9/{width}?mandant=ard","title":"Wer weiß denn sowas? | 03.07.2020 - Standbild"},"maturityContentRating":"NONE","mediaCollection":{"embedded":{"_type":"video","_isLive":false,"_defaultQuality":["auto",2,4,3,1,0],"_previewImage":"https://img.ardmediathek.de/standard/00/77/40/79/80/-1774185891/16x9/960?mandant=ard","_subtitleUrl":"https://www.ardmediathek.de/subtitle/411033","_subtitleOffset":0,"_mediaArray":[{"_plugin":1,"_mediaStreamArray":[{"_quality":"auto","_stream":"https://ndrod-vh.akamaihd.net/i/ndr/2020/0703/TV-20200703-1726-5500.,hd,hq,ln,hi,mn,lo,ao,.mp4.csmil/master.m3u8"},{"_quality":0,"_server":"","_cdn":"akamai","_stream":"https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.lo.mp4"},{"_quality":1,"_stream":["https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.ln.mp4","https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.hi.mp4","https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.mn.mp4"]},{"_quality":2,"_server":"","_cdn":"akamai","_width":960,"_height":540,"_stream":"https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.hq.mp4"},{"_quality":3,"_server":"","_cdn":"akamai","_width":1280,"_height":720,"_stream":"https://mediandr-a.akamaihd.net/progressive/2020/0703/TV-20200703-1726-5500.hd.mp4"}]}],"_alternativeMediaArray":[],"_sortierArray":[1],"_duration":2654,"_dvrEnabled":false,"_geoblocked":false},"href":"http://api.ardmediathek.de/page-gateway/mediacollection/77407976?devicetype={devicetype}"},"pagination":null,"personalized":false,"playerConfig":{"embedded":{"_baseUrl":"/ard/static/player/","_baseAssetUrl":"/ard/static/player/base/","_autoplay":"FORCE","_showSubtitelAtStart":false,"_addons":["AddonUntertitel_ebu_tt"],"_solaAnalyticsEnabled":true,"_solaAnalyticsConfig":"/play/sola/77407976","_pixelConfig":[{"tracker":"AGF","clipUrl":"https://ndrod-vh.akamaihd.net/i/ndr/2020/0703/TV-20200703-1726-5500.,hd,hq,ln,hi,mn,lo,ao,.mp4.csmil/master.m3u8","clipType":"content","agfVCID":"b02","agfMetadata":"https://www.ardmediathek.de/goto/tv/774079762654NDR Fernsehen_Wer weiß denn sowas?_Wer weiß denn sowas? | 03.07.2020_03.07.2020 16:25nop0,0p2,Np5,ARD Mediathekp7,crid://ndr.de/4c16eae8-6b68-48fc-a7e5-01aaa668c3bcp8,2654p9,Wer weiß denn sowas?_Wer weiß denn sowas? | 03.07.2020_03.07.2020 16:25p10,NDR Fernsehenp12,Contentp15,196272720_10563275p16,ARD_Unterhaltungp18,Np19,NDR","agfClipLength":"2654","agfGlobalParamsSDK":{"clientid":"de-605508","apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5","sfcode":"eu","prod":"vc","vcid":"b02","apn":"ARD Mediathek"},"agfMetaDataSDK":{"assetid":"https://ndrod-vh.akamaihd.net/i/ndr/2020/0703/TV-20200703-1726-5500.,hd,hq,ln,hi,mn,lo,ao,.mp4.csmil/master.m3u8","type":"content","program":"Wer weiß denn sowas?","title":"NDR Fernsehen_Wer weiß denn sowas?_Wer weiß denn sowas? | 03.07.2020_03.07.2020 16:25","length":"2654","livestream":"no","uurl":"https://www.ardmediathek.de/goto/tv/77407976","nol_c0":"p0,0","nol_c2":"p2,N","nol_c5":"p5,ARD Mediathek","nol_c7":"p7,crid://ndr.de/4c16eae8-6b68-48fc-a7e5-01aaa668c3bc","nol_c8":"p8,2654","nol_c9":"p9,Wer weiß denn sowas?_Wer weiß denn sowas? | 03.07.2020_03.07.2020 16:25","nol_c10":"p10,NDR Fernsehen","nol_c12":"p12,Content","nol_c15":"p15,196272720_10563275","nol_c16":"p16,ARD_Unterhaltung","nol_c18":"p18,N","nol_c19":"p19,NDR"}},{"tracker":"ATI","x3":"video","x5":"NDR","x6":"NDR+Fernsehen","x7":"Ohne+Sendereihe","x8":"6","x9":"NDR","x10":"1","x14":"77407976","x20":"2654","clipUrl":"https://ndrod-vh.akamaihd.net/i/ndr/2020/0703/TV-20200703-1726-5500.,hd,hq,ln,hi,mn,lo,ao,.mp4.csmil/master.m3u8","clipTitle":"Wer weiß denn sowas? | 03.07.2020","countingUrl":"/ard/servlet/count/77407976"}]},"href":"http://api.ardmediathek.de/page-gateway/playerconfig/77407976"},"publicationService":{"name":"NDR Fernsehen","logo":{"title":"NDR Fernsehen","alt":"NDR Logo","producerName":"NDR","src":"https://img.ardmediathek.de/standard/00/21/51/88/72/-2062574680/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"ndr","id":"b3JnYW5pemF0aW9uX05EUg"},"links":{"self":{"id":"5kG69Jms5UMSSUMwMCY0k0","title":"Player Widget ARD","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL25kci5kZS80YzE2ZWFlOC02YjY4LTQ4ZmMtYTdlNS0wMWFhYTY2OGMzYmM?pageNumber=0&pageSize=100&embedded=true","type":"application/vnd.ard.widget+json"}},"show":null,"synopsis":"Das beliebte Wissensspiel mit Bernhard Hoëcker und Elton. Moderator Kai Pflaume präsentiert unglaubliche Rätselfragen. Welches Team gewinnt? Gäste: Hardy Krüger jr. und Oliver Masucci.","title":"Wer weiß denn sowas? | 03.07.2020","type":"player_ondemand"}]} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_only_single_resolution.json b/src/test/resources/ard/ard_film_page_only_single_resolution.json deleted file mode 100644 index 42f4cf3f6..000000000 --- a/src/test/resources/ard/ard_film_page_only_single_resolution.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "fskRating": "NONE", - "id": "1m0kFcyvowSiEYW4c6YYWg", - "isChildContent": false, - "personalized": false, - "links": { - "self": { - "id": "1m0kFcyvowSiEYW4c6YYWg", - "urlId": "1m0kFcyvowSiEYW4c6YYWg", - "title": "Ondemand PlayerPage ARD", - "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv?embedded=true", - "type": "application/vnd.ard.page+json", - "partner": "ard" - } - }, - "title": "Der Spargel · Feldküche: Vom Acker direkt in den Topf", - "tracking": { - "aggregationLevelId": 38, - "atiCustomVars": { - "clipTitle": "Der Spargel · Feldküche: Vom Acker direkt in den Topf", - "mediaType": "video", - "lra": "SWR", - "channel": "SWR", - "show": "Planet Schule", - "contentTypes": "UT | Online first", - "mediaDistributionType": 1, - "contentId": 10492683, - "metadataId": "crid://planet-schule.de/ARD_10547_video", - "clipLength": 600 - }, - "chapter2": "Player", - "chapter3": "Planet Schule", - "environmentId": 511893, - "pageTitle": "Mediathek/Player/Planet Schule/Der Spargel · Feldküche: Vom Acker direkt in den Topf/10492683/20230210_0430", - "szmType": "CP" - }, - "widgets": [ - { - "availableTo": "2028-02-10T04:30:00Z", - "blockedByFsk": false, - "broadcastedOn": "2023-02-10T04:30:00Z", - "embeddable": true, - "geoblocked": false, - "id": "Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv", - "image": { - "alt": "ohne Beschreibung", - "producerName": "WDR", - "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:fbb9b4ba3de7165a?w={width}&ch=816f04230bb72443", - "title": "Der Spargel · Feldküche: Vom Acker direkt in den Topf" - }, - "isChildContent": false, - "maturityContentRating": "NONE", - "mediaCollection": { - "embedded": { - "_defaultQuality": [ - "auto", - 2, - 3, - 4, - 1, - 0, - 5 - ], - "_duration": 600, - "_dvrEnabled": false, - "_geoblocked": false, - "_isLive": false, - "_mediaArray": [ - { - "_mediaStreamArray": [ - { - "_height": 360, - "_quality": 1, - "_stream": "https://odplanetschule-a.akamaihd.net/schulfernsehen/feldkueche/feldkueche-vom-acker-direkt-in-den-topf-spargel.mp4", - "_width": 640 - }, - { - "_quality": "auto", - "_stream": "https://swrplanetschulevod.akamaized.net/i/schulfernsehen/feldkueche/feldkueche-vom-acker-direkt-in-den-topf-spargel,,.mp4/master.m3u8" - } - ], - "_plugin": 1 - } - ], - "_previewImage": "https://api.ardmediathek.de/image-service/images/urn:ard:image:fbb9b4ba3de7165a?w=960&ch=816f04230bb72443", - "_sortierArray": [ - 1 - ], - "_subtitleUrl": "https://api.ardmediathek.de/subtitle-format-service/ebutt/urn:ard:subtitle:1090d019e4f165e1", - "_subtitleWebVTTUrl": "https://api.ardmediathek.de/subtitle-format-service/webvtt/urn:ard:subtitle:1090d019e4f165e1.vtt", - "_type": "video" - }, - "href": "https://api.ardmediathek.de/page-gateway/mediacollection/Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv?devicetype=pc" - }, - "pagination": null, - "personalized": false, - "playerConfig": { - "embedded": { - "_autoplay": "FORCE", - "_baseAssetUrl": "/ard/static/player/base/", - "_baseUrl": "/ard/static/player/", - "_pixelConfig": [ - { - "agfMetaDataSDK": { - "assetId": "10492683", - "length": "600", - "nol_c0": "p0,666", - "nol_c10": "p10,SWR", - "nol_c12": "p12,Content", - "nol_c15": "p15,", - "nol_c16": "p16,ARD_Information", - "nol_c18": "p18,N", - "nol_c19": "p19,WDR", - "nol_c2": "p2,N", - "nol_c5": "p5,ARD Mediathek", - "nol_c7": "p7,crid://planet-schule.de/ARD_10547_video", - "nol_c8": "p8,600", - "nol_c9": "p9,Planet Schule_Der Spargel · Feldküche: Vom Acker direkt in den Topf_0", - "program": "Planet Schule", - "title": "SWR_Planet Schule_Der Spargel · Feldküche: Vom Acker direkt in den Topf_0", - "type": "content" - }, - "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", - "tracker": "AGF" - } - ], - "_showSubtitelAtStart": false - }, - "href": "https://api.ardmediathek.de/page-gateway/playerconfig/Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv" - }, - "publicationService": { - "name": "SWR", - "logo": { - "title": "Logo SWR", - "alt": "Logo SWR", - "producerName": "SWR", - "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", - "aspectRatio": "16x9" - }, - "publisherType": "TV", - "partner": "swr", - "id": "b3JnYW5pemF0aW9uX1NXUg" - }, - "links": { - "self": { - "id": "5kG69Jms5UMSSUMwMCY0k0", - "urlId": "5kG69Jms5UMSSUMwMCY0k0", - "title": "Player Widget ARD", - "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv?pageNumber=0&pageSize=100&embedded=true", - "type": "application/vnd.ard.widget+json", - "partner": "ard" - } - }, - "show": { - "id": "Y3JpZDovL3N3ci5kZS8yNTgyNzUw", - "title": "Planet Schule", - "image": { - "alt": "Logo Planet Schule", - "producerName": "SWR, SWR", - "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:ea5e08eeec8ef204?w={width}&ch=ae7717289dd776ef", - "title": "Planet Schule" - } - }, - "synopsis": "Spargelernte ist Knochenarbeit! Das erlebt auch Tom bei Landwirtin Regina Rothkopf und ihrem Sohn Maximilian in Euskirchen. Ob grün oder weiß, die Stangen sind der Spross der Spargelpflanze und ein gesundes Frühlingsgemüse. Zusammen mit Maximilian brät Tom am Feldrand aus dem frisch geernteten Spargel ein schnelles Pfannengericht.", - "title": "Der Spargel · Feldküche: Vom Acker direkt in den Topf", - "type": "player_ondemand" - }, - { - "compilationType": "itemsOfShow", - "id": "Y3JpZDovL3N3ci5kZS8yNTgyNzUw", - "isChildContent": false, - "pagination": { - "pageNumber": 0, - "pageSize": 24, - "totalElements": 1326 - }, - "personalized": false, - "links": { - "self": { - "id": "Y3JpZDovL3N3ci5kZS8yNTgyNzUw", - "urlId": "Y3JpZDovL3N3ci5kZS8yNTgyNzUw", - "title": "Planet Schule", - "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3N3ci5kZS8yNTgyNzUw?excludedAssetIds=Y3JpZDovL3BsYW5ldC1zY2h1bGUuZGUvQVJEXzEwNTQ3X3ZpZGVv&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false", - "type": "application/vnd.ard.widget+json", - "partner": "ard" - } - }, - "size": "m", - "swipeable": true, - "teasers": [], - "title": "Planet Schule", - "titleVisible": true, - "type": "gridlist" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_uhd.json b/src/test/resources/ard/ard_film_page_uhd.json deleted file mode 100644 index 768676981..000000000 --- a/src/test/resources/ard/ard_film_page_uhd.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "fskRating":"NONE", - "id":"1m0kFcyvowSiEYW4c6YYWg", - "isChildContent":false, - "personalized":false, - "links":{ - "self":{ - "id":"1m0kFcyvowSiEYW4c6YYWg", - "urlId":"1m0kFcyvowSiEYW4c6YYWg", - "title":"Ondemand PlayerPage ARD", - "href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU?embedded=true", - "type":"application/vnd.ard.page+json", - "partner":"ard" - } - }, - "title":"Wie ist das DOWN-SYNDROM ZU HABEN?", - "tracking":{ - "aggregationLevelId":38, - "atiCustomVars":{ - "clipTitle":"Wie ist das DOWN-SYNDROM ZU HABEN.", - "mediaType":"video", - "lra":"funk", - "channel":"funk", - "show":"Leeroy will's wissen", - "contentTypes":"", - "mediaDistributionType":1, - "contentId":10651005, - "metadataId":"crid://funk.net/12187/video/1812695", - "clipLength":950 - }, - "chapter2":"Player", - "chapter3":"Leeroy will's wissen", - "environmentId":511893, - "pageTitle":"Mediathek/Player/Leeroy will's wissen/Wie ist das DOWN-SYNDROM ZU HABEN./10651005/20220724_1800", - "szmType":"CP" - }, - "widgets":[ - { - "availableTo":null, - "blockedByFsk":false, - "broadcastedOn":"2022-07-24T18:00:00Z", - "embeddable":false, - "geoblocked":false, - "id":"Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU", - "image":{ - "alt":"Wie ist das DOWN-SYNDROM ZU HABEN? - Thumbnail", - "producerName":"funk", - "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:e43c99f3311675cb?w={width}&ch=6adcbcd327f902ca", - "title":"Wie ist das DOWN-SYNDROM ZU HABEN? - Thumbnail" - }, - "isChildContent":false, - "maturityContentRating":"NONE", - "mediaCollection":{ - "embedded":{ - "_defaultQuality":[ - "auto", - 2, - 3, - 4, - 1, - 0, - 5 - ], - "_duration":950, - "_dvrEnabled":false, - "_geoblocked":false, - "_isLive":false, - "_mediaArray":[ - { - "_mediaStreamArray":[ - { - "_height":720, - "_quality":3, - "_stream":"https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/2-M7wvJWnjNmgfBGCLDYZV.mp4?fv=1", - "_width":1280 - }, - { - "_quality":"auto", - "_stream":"https://funk-02.akamaized.net/22679/files/22/07/12/5933559/22679-kfbZDB6QCjKvr7Y.ism/manifest.m3u8" - }, - { - "_height":360, - "_quality":1, - "_stream":"https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/4-q4xvKF6nmVLY7Pw8Ckr9.mp4?fv=1", - "_width":640 - }, - { - "_height":1080, - "_quality":4, - "_stream":"https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/1-dz73ZV4wXPrfK8YDMBxj.mp4?fv=1", - "_width":1920 - }, - { - "_height":2160, - "_quality":5, - "_stream":"https://funk-02dd.akamaized.net/22679/files/22/07/12/5933559/34-tMcygV2Kzjf9QXxh7Jqd.mp4?fv=1", - "_width":3840 - } - ], - "_plugin":1 - } - ], - "_previewImage":"https://api.ardmediathek.de/image-service/images/urn:ard:image:e43c99f3311675cb?w=960&ch=6adcbcd327f902ca", - "_sortierArray":[ - 1 - ], - "_type":"video" - }, - "href":"https://api.ardmediathek.de/page-gateway/mediacollection/Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU?devicetype=pc" - }, - "pagination":null, - "personalized":false, - "playerConfig":{ - "embedded":{ - "_autoplay":"FORCE", - "_baseAssetUrl":"/ard/static/player/base/", - "_baseUrl":"/ard/static/player/", - "_pixelConfig":[ - { - "agfMetaDataSDK":{ - "assetId":"10651005", - "length":"950", - "nol_c0":"p0,0", - "nol_c10":"p10,funk", - "nol_c12":"p12,Content", - "nol_c15":"p15,", - "nol_c16":"p16,", - "nol_c18":"p18,N", - "nol_c19":"p19,funk", - "nol_c2":"p2,Y", - "nol_c5":"p5,ARD Mediathek", - "nol_c7":"p7,funk/episode/video/1812695", - "nol_c8":"p8,950", - "nol_c9":"p9,Leeroy will's wissen_Wie ist das DOWN-SYNDROM ZU HABEN?_24.07.2022 18:00", - "program":"Leeroy will's wissen", - "title":"funk_Leeroy will's wissen_Wie ist das DOWN-SYNDROM ZU HABEN?_24.07.2022 18:00", - "type":"content" - }, - "appId":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5", - "tracker":"AGF" - } - ], - "_showSubtitelAtStart":false - }, - "href":"https://api.ardmediathek.de/page-gateway/playerconfig/Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU" - }, - "publicationService":{ - "name":"funk", - "logo":{ - "title":"Logo funk", - "alt":"Logo funk", - "producerName":"funk", - "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", - "aspectRatio":"16x9" - }, - "publisherType":"TV", - "partner":"funk", - "id":"b3JnYW5pemF0aW9uX2Z1bms" - }, - "links":{ - "self":{ - "id":"5kG69Jms5UMSSUMwMCY0k0", - "urlId":"5kG69Jms5UMSSUMwMCY0k0", - "title":"Player Widget ARD", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU?pageNumber=0&pageSize=100&embedded=true", - "type":"application/vnd.ard.widget+json", - "partner":"ard" - } - }, - "show":{ - "id":"Y3JpZDovL2Z1bmsubmV0LzEyMTg3", - "title":"Leeroy will's wissen", - "image":{ - "alt":"Leeroy will's wissen - Teaser", - "producerName":"funk", - "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:0caedf72350156b8?w={width}&ch=91defea8ba718df1", - "title":"Leeroy will's wissen - Teaser" - } - }, - "synopsis":"Tamara ist 26 Jahre alt und hat das Down-Syndrom. Doch das ist für sie kein Hindernis – ganz im Gegenteil! Seit Jahren ist sie als Model und Schauspielerin sehr erfolgreich. So stand sie schon für die Designer Hugo Boss und Victoria Beckham vor der Kamera", - "title":"Wie ist das DOWN-SYNDROM ZU HABEN?", - "type":"player_ondemand" - }, - { - "compilationType":"itemsOfShow", - "id":"Y3JpZDovL2Z1bmsubmV0LzEyMTg3", - "isChildContent":false, - "pagination":{ - "pageNumber":0, - "pageSize":24, - "totalElements":119 - }, - "personalized":false, - "links":{ - "self":{ - "id":"Y3JpZDovL2Z1bmsubmV0LzEyMTg3", - "urlId":"Y3JpZDovL2Z1bmsubmV0LzEyMTg3", - "title":"Leeroy will's wissen", - "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Z1bmsubmV0LzEyMTg3?excludedAssetIds=Y3JpZDovL2Z1bmsubmV0LzEyMTg3L3ZpZGVvLzE4MTI2OTU&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false", - "type":"application/vnd.ard.widget+json", - "partner":"ard" - } - }, - "size":"m", - "swipeable":true, - "teasers":[ - ], - "title":"Leeroy will's wissen", - "titleVisible":true, - "type":"gridlist" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/ard/ard_film_page_with_related11.json b/src/test/resources/ard/ard_film_page_with_related11.json deleted file mode 100644 index be74ac447..000000000 --- a/src/test/resources/ard/ard_film_page_with_related11.json +++ /dev/null @@ -1 +0,0 @@ -{"fskRating":"NONE","id":"1m0kFcyvowSiEYW4c6YYWg","personalized":false,"links":{"self":{"id":"1m0kFcyvowSiEYW4c6YYWg","title":"Ondemand PlayerPage ARD","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2I5Y2FiMjMzLTMxMjEtNGE0Mi1iYjZlLWY3MWJkZGExNWZmYw?embedded=true","type":"application/vnd.ard.page+json"}},"title":"Live nach Neun","tracking":{"aggregationLevelId":38,"atiCustomVars":{"clipTitle":"Live nach Neun","mediaType":"video","lra":"Das Erste","channel":"Das Erste","show":"Live nach neun","contentTypes":"UT","mediaDistributionType":1,"contentId":77388670,"metadataId":"crid://daserste.de/live nach neun/b9cab233-3121-4a42-bb6e-f71bdda15ffc","clipLength":2986},"chapter2":"Player","chapter3":"Live nach neun","environmentId":511893,"pageTitle":"Mediathek/Player/Live nach neun/Live nach Neun/77388670/20200703_0705","szmType":"CP"},"widgets":[{"availableTo":null,"blockedByFsk":false,"broadcastedOn":"2020-07-03T07:05:00Z","embeddable":true,"geoblocked":false,"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2I5Y2FiMjMzLTMxMjEtNGE0Mi1iYjZlLWY3MWJkZGExNWZmYw","image":{"alt":"Peter Großmann und Alina Stiegler","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/77/38/86/76/-2114473875/16x9/{width}?mandant=ard","title":"Live nach Neun - Standbild"},"maturityContentRating":"NONE","mediaCollection":{"embedded":{"_type":"video","_isLive":false,"_defaultQuality":["auto",2,4,3,1,0],"_previewImage":"https://img.ardmediathek.de/standard/00/77/38/86/76/-2114473875/16x9/960?mandant=ard","_subtitleUrl":"https://www.ardmediathek.de/subtitle/410911","_subtitleOffset":0,"_mediaArray":[{"_plugin":1,"_mediaStreamArray":[{"_quality":"auto","_server":"","_cdn":"flashls","_stream":"https://dasersteuni-vh.akamaihd.net/i/de/2020/07/03/,live_20200703_070454_sendeton_1920x1080-50p-8000kbit,live_20200703_070454_sendeton_1280x720-50p-5200kbit,live_20200703_070454_sendeton_960x540-50p-2600kbit,live_20200703_070454_sendeton_640x360-25p-1300kbit,live_20200703_070454_sendeton_512x288-25p-700kbit,live_20200703_070454_sendeton_480x270-25p-270kbit,.mp4.csmil/master.m3u8"},{"_quality":1,"_stream":["https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_640x360-25p-1300kbit.mp4","https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_512x288-25p-700kbit.mp4","https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_480x270-25p-270kbit.mp4"]},{"_quality":2,"_server":"","_cdn":"akamai","_width":960,"_height":540,"_stream":"https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_960x540-50p-2600kbit.mp4"},{"_quality":3,"_server":"","_cdn":"akamai","_width":1280,"_height":720,"_stream":"https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_1280x720-50p-5200kbit.mp4"},{"_quality":4,"_server":"","_cdn":"akamai","_width":1920,"_height":1080,"_stream":"https://pdvideosdaserste-a.akamaihd.net/de/2020/07/03/live_20200703_070454_sendeton_1920x1080-50p-8000kbit.mp4"}]}],"_alternativeMediaArray":[],"_sortierArray":[1],"_duration":2986,"_dvrEnabled":false,"_geoblocked":false},"href":"http://api.ardmediathek.de/page-gateway/mediacollection/77388670?devicetype={devicetype}"},"pagination":null,"personalized":false,"playerConfig":{"embedded":{"_baseUrl":"/ard/static/player/","_baseAssetUrl":"/ard/static/player/base/","_autoplay":"FORCE","_showSubtitelAtStart":false,"_addons":["AddonUntertitel_ebu_tt"],"_solaAnalyticsEnabled":true,"_solaAnalyticsConfig":"/play/sola/77388670","_pixelConfig":[{"tracker":"AGF","clipUrl":"https://dasersteuni-vh.akamaihd.net/i/de/2020/07/03/,live_20200703_070454_sendeton_1920x1080-50p-8000kbit,live_20200703_070454_sendeton_1280x720-50p-5200kbit,live_20200703_070454_sendeton_960x540-50p-2600kbit,live_20200703_070454_sendeton_640x360-25p-1300kbit,live_20200703_070454_sendeton_512x288-25p-700kbit,live_20200703_070454_sendeton_480x270-25p-270kbit,.mp4.csmil/master.m3u8","clipType":"content","agfVCID":"b02","agfMetadata":"https://www.ardmediathek.de/goto/tv/773886702986Das Erste_Live nach neun_Live nach Neun_03.07.2020 09:05nop0,0p2,Np5,ARD Mediathekp7,crid://daserste.de/live nach neun/b9cab233-3121-4a42-bb6e-f71bdda15ffcp8,2986p9,Live nach neun_Live nach Neun_03.07.2020 09:05p10,Das Erstep12,Contentp15,X004547778p16,Das Erste_Information|Magazin||Live nach Neunp18,Np19,WDR","agfClipLength":"2986","agfGlobalParamsSDK":{"clientid":"de-605508","apid":"PA02DC09C-B8D3-4098-87D2-2C023682D6D5","sfcode":"eu","prod":"vc","vcid":"b02","apn":"ARD Mediathek"},"agfMetaDataSDK":{"assetid":"https://dasersteuni-vh.akamaihd.net/i/de/2020/07/03/,live_20200703_070454_sendeton_1920x1080-50p-8000kbit,live_20200703_070454_sendeton_1280x720-50p-5200kbit,live_20200703_070454_sendeton_960x540-50p-2600kbit,live_20200703_070454_sendeton_640x360-25p-1300kbit,live_20200703_070454_sendeton_512x288-25p-700kbit,live_20200703_070454_sendeton_480x270-25p-270kbit,.mp4.csmil/master.m3u8","type":"content","program":"Live nach neun","title":"Das Erste_Live nach neun_Live nach Neun_03.07.2020 09:05","length":"2986","livestream":"no","uurl":"https://www.ardmediathek.de/goto/tv/77388670","nol_c0":"p0,0","nol_c2":"p2,N","nol_c5":"p5,ARD Mediathek","nol_c7":"p7,crid://daserste.de/live nach neun/b9cab233-3121-4a42-bb6e-f71bdda15ffc","nol_c8":"p8,2986","nol_c9":"p9,Live nach neun_Live nach Neun_03.07.2020 09:05","nol_c10":"p10,Das Erste","nol_c12":"p12,Content","nol_c15":"p15,X004547778","nol_c16":"p16,Das Erste_Information|Magazin||Live nach Neun","nol_c18":"p18,N","nol_c19":"p19,WDR"}},{"tracker":"ATI","x3":"video","x5":"Das+Erste","x6":"Das+Erste","x7":"Live+nach+neun","x8":"6","x9":"WDR","x10":"1","x14":"77388670","x20":"2986","clipUrl":"https://dasersteuni-vh.akamaihd.net/i/de/2020/07/03/,live_20200703_070454_sendeton_1920x1080-50p-8000kbit,live_20200703_070454_sendeton_1280x720-50p-5200kbit,live_20200703_070454_sendeton_960x540-50p-2600kbit,live_20200703_070454_sendeton_640x360-25p-1300kbit,live_20200703_070454_sendeton_512x288-25p-700kbit,live_20200703_070454_sendeton_480x270-25p-270kbit,.mp4.csmil/master.m3u8","clipTitle":"Live nach Neun","countingUrl":"/ard/servlet/count/77388670"}]},"href":"http://api.ardmediathek.de/page-gateway/playerconfig/77388670"},"publicationService":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"links":{"self":{"id":"5kG69Jms5UMSSUMwMCY0k0","title":"Player Widget ARD","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/5kG69Jms5UMSSUMwMCY0k0/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2I5Y2FiMjMzLTMxMjEtNGE0Mi1iYjZlLWY3MWJkZGExNWZmYw?pageNumber=0&pageSize=100&embedded=true","type":"application/vnd.ard.widget+json"}},"show":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVu","title":"Live nach neun","image":{"alt":"Bild zur Sendung Live nach neun","producerName":"Das Erste","src":"https://img.ardmediathek.de/standard/00/63/08/96/12/-1442109143/16x9/{width}?mandant=ard","title":"Live nach neun - Bevorzugt"}},"synopsis":"","title":"Live nach Neun","type":"player_ondemand"},{"compilationType":"itemsOfShow","id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzIwMjAtMDctMDNfMDktMDUtTUVTWg","pagination":{"pageNumber":0,"pageSize":100,"totalElements":3},"personalized":false,"links":{"self":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzIwMjAtMDctMDNfMDktMDUtTUVTWg","title":"Live nach Neun","href":"https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzIwMjAtMDctMDNfMDktMDUtTUVTWg?excludedAssetIds=Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2I5Y2FiMjMzLTMxMjEtNGE0Mi1iYjZlLWY3MWJkZGExNWZmYw&pageNumber=0&pageSize=100&embedded=true","type":"application/vnd.ard.widget+json"}},"size":"m","swipeable":true,"teasers":[{"availableTo":"2020-07-06T21:59:00Z","broadcastedOn":"2020-07-03T07:05:00Z","decor":"none","duration":248,"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA","images":{"aspect16x9":{"alt":"Laura di Salvo","producerName":"WDR","src":"https://img.ardmediathek.de/standard/00/77/39/06/22/-295433861/16x9/{width}?mandant=ard","title":"Laura di Salvo mit dem Wochenendwetter - Standbild"}},"longTitle":"Laura di Salvo mit dem Wochenendwetter","mediumTitle":"Laura di Salvo mit dem Wochenendwetter","personalized":false,"playtime":null,"publicationService":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"links":{"self":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA","title":"Laura di Salvo mit dem Wochenendwetter","href":"https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA","type":"application/vnd.ard.teaser+json"},"target":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA","title":"Laura di Salvo mit dem Wochenendwetter","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuL2U2NjBiMDU0LWM3YmYtNDdkYy1iMmFlLWM1N2NkNmM1MjVhZA?devicetype=pc&embedded=true","type":"application/vnd.ard.page+json"}},"shortTitle":"Laura di Salvo mit dem Wochenendwetter","show":{"id":"crid://daserste.de/live nach neun","coremediaId":52323934,"title":"Live nach neun","publisher":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"self":null,"images":{"16x9":{"title":"Live nach neun - Bevorzugt","alt":"Bild zur Sendung Live nach neun","producerName":"Das Erste","src":"https://img.ardmediathek.de/standard/00/63/08/96/12/-1442109143/16x9/{width}?mandant=ard","aspectRatio":"16x9"}},"shortSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","synopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","longSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","groupingType":"SHOW","homepage":null},"subtitled":false,"type":"ondemand"},{"availableTo":"2020-07-17T21:59:00Z","broadcastedOn":"2020-07-03T07:05:00Z","decor":"none","duration":139,"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg","images":{"aspect16x9":{"alt":"Live nach Neun","producerName":"WDR","src":"https://img.ardmediathek.de/standard/00/77/39/06/50/-295433861/16x9/{width}?mandant=ard","title":"Spot an für Neues aus der Promiwelt - Standbild"}},"longTitle":"Spot an für Neues aus der Promiwelt","mediumTitle":"Spot an für Neues aus der Promiwelt","personalized":false,"playtime":null,"publicationService":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"links":{"self":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg","title":"Spot an für Neues aus der Promiwelt","href":"https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg","type":"application/vnd.ard.teaser+json"},"target":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg","title":"Spot an für Neues aus der Promiwelt","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzc2NjcyOTI0LWNmNjMtNDhkNy05ZTcwLTQ1Y2EzYmZmZTUzMg?devicetype=pc&embedded=true","type":"application/vnd.ard.page+json"}},"shortTitle":"Spot an für Neues aus der Promiwelt","show":{"id":"crid://daserste.de/live nach neun","coremediaId":52323934,"title":"Live nach neun","publisher":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"self":null,"images":{"16x9":{"title":"Live nach neun - Bevorzugt","alt":"Bild zur Sendung Live nach neun","producerName":"Das Erste","src":"https://img.ardmediathek.de/standard/00/63/08/96/12/-1442109143/16x9/{width}?mandant=ard","aspectRatio":"16x9"}},"shortSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","synopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","longSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","groupingType":"SHOW","homepage":null},"subtitled":false,"type":"ondemand"},{"availableTo":"2021-07-03T21:59:00Z","broadcastedOn":"2020-07-03T07:05:00Z","decor":"none","duration":322,"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ","images":{"aspect16x9":{"alt":"Live nach Neun","producerName":"WDR","src":"https://img.ardmediathek.de/standard/00/77/39/07/10/-295433861/16x9/{width}?mandant=ard","title":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird - Standbild"}},"longTitle":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird","mediumTitle":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird","personalized":false,"playtime":null,"publicationService":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"links":{"self":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ","title":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird","href":"https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ","type":"application/vnd.ard.teaser+json"},"target":{"id":"Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ","title":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird","href":"https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUgbmFjaCBuZXVuLzhmZWRlOTE2LTg4NmMtNDZhNy1iNmI5LTQ5NmMzMWJlNWZiZQ?devicetype=pc&embedded=true","type":"application/vnd.ard.page+json"}},"shortTitle":"Versuchskraftwerk Jülich: Wie aus Licht Wasserstoff wird","show":{"id":"crid://daserste.de/live nach neun","coremediaId":52323934,"title":"Live nach neun","publisher":{"name":"Das Erste","logo":{"title":"DasErste","alt":"DasErste","producerName":"ARD","src":"https://img.ardmediathek.de/standard/00/21/51/88/56/-295433861/0/{width}?mandant=ard","aspectRatio":"0"},"publisherType":"TV","partner":"das_erste","id":"b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ"},"self":null,"images":{"16x9":{"title":"Live nach neun - Bevorzugt","alt":"Bild zur Sendung Live nach neun","producerName":"Das Erste","src":"https://img.ardmediathek.de/standard/00/63/08/96/12/-1442109143/16x9/{width}?mandant=ard","aspectRatio":"16x9"}},"shortSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","synopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","longSynopsis":"In dem neuen Vormittagsformat geht es um Land und Leute in unterschiedlichen Regionen, Alltagshelden, Schicksale und Erfolgsgeschichten.","groupingType":"SHOW","homepage":null},"subtitled":false,"type":"ondemand"}],"title":"Live nach Neun","titleVisible":true,"type":"gridlist"}]} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_DGS_AD.json b/src/test/resources/ard/ard_item_DGS_AD.json new file mode 100644 index 000000000..6b5093682 --- /dev/null +++ b/src/test/resources/ard/ard_item_DGS_AD.json @@ -0,0 +1,540 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": true, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Die schlaflose Eule (mit Gebärdensprache)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjkvZ2ViYWVyZGVuc3ByYWNoZQ?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Die schlaflose Eule (mit Gebärdensprache)", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Die schlaflose Eule (mit Gebärdensprache)", + "mediaType": "video", + "lra": "KiKA", + "channel": "KiKA", + "show": "Sesamstraße Magazin", + "contentTypes": "GD | UT", + "mediaDistributionType": 1, + "contentId": 10147697, + "metadataId": "crid://ndr.de/6d7e0ad0-48d9-4fa3-b7b3-8463e88892b9/gebaerdensprache", + "clipLength": 1226 + }, + "chapter2": "Player", + "chapter3": "Sesamstraße Magazin", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Sesamstraße Magazin/Die schlaflose Eule (mit Gebärdensprache)/10147697/20240219_0645", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:1ad647c65f0db565", + "page_content_title": "Die schlaflose Eule (mit Gebärdensprache)", + "page_id": "player_ondemand-page-ard", + "page_institution": "KiKA", + "page_institution_id": "urn:ard:institution:4ef58479de880838", + "page_publisher": "KiKA", + "page_publisher_id": "urn:ard:publisher:d974dc16b65aef8b", + "page_show": "Sesamstraße Magazin", + "page_show_id": "urn:ard:show:6d28705b69b83872", + "page_title": "Die schlaflose Eule (mit Gebärdensprache)", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2026-02-19T06:45:00Z", + "binaryFeatures": [ + "DGS", + "UT", + "AD" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-02-19T06:45:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjkvZ2ViYWVyZGVuc3ByYWNoZQ", + "image": { + "alt": "Sesamstraßen Logo Jan Delay mit Sesamstraßen Puppen und Disco-Kugel.", + "producerName": "Sesamstraße", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:7752e5eeb1e3fa5d?w={width}&ch=58b367a962e5dfe6", + "title": "Die schlaflose Eule" + }, + "isChildContent": true, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": true, + "meta": { + "availableToDateTime": "2026-02-19T06:45:00Z", + "broadcastedOnDateTime": "2024-02-19T06:45:00Z", + "clipSourceName": "NDR", + "durationSeconds": 1226, + "images": [ + { + "alt": "Sesamstraßen Logo Jan Delay mit Sesamstraßen Puppen und Disco-Kugel.", + "aspectRatio": "16x9", + "imageSourceName": "Sesamstraße", + "kind": "preview", + "title": "Die schlaflose Eule", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:7752e5eeb1e3fa5d?w=960&ch=58b367a962e5dfe6" + } + ], + "publicationService": { + "id": "ard", + "name": "KiKA", + "partner": "kika" + }, + "seriesTitle": "Sesamstraße Magazin", + "synopsis": "2893. Ernie & Jan Delay bringen den müden Bert mit ihrem Lied um seinen nächtlichen Schlaf.\nIn einer neuen Sesamstraßen Reihe nehmen uns Kinder mit an ihre \"Lieblingsorte\". Heute besuchen wir mit Elli (4), Jonathan (5) und Mattis (8) das nächtliche Miniaturwunderland.\nAußerdem hat der Prinz Probleme damit, Dornröschen zu wecken und Krümelmonster bringt Abby zur Verzweiflung. Susi Schraube erfindet eine Maschine, die beim Einschlafen hilft.", + "title": "Die schlaflose Eule" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjk" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "10147697", + "length": "1226", + "nol_c0": "p0,0", + "nol_c10": "p10,KiKA", + "nol_c12": "p12,Content", + "nol_c15": "p15,", + "nol_c16": "p16,ARD_Information", + "nol_c18": "p18,N", + "nol_c19": "p19,NDR", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://ndr.de/4440_2021-12-16-07-45", + "nol_c8": "p8,1226", + "nol_c9": "p9,Sesamstraße Magazin_Die schlaflose Eule_19.02.2024 06:45", + "program": "Sesamstraße Magazin", + "title": "KiKA_Sesamstraße Magazin_Die schlaflose Eule_19.02.2024 06:45", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "1226", + "mediaLabel": "Die schlaflose Eule__10147697__AD | GD | UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "KiKA", + "mediaTheme2": "KiKA", + "mediaTheme3": "Sesamstraße Magazin", + "mediaType": "video", + "playerId": "urn:ard:publication:1ad647c65f0db565", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Die schlaflose Eule", + "av_content_duration": 1226000, + "av_content_id": "urn:ard:publication:1ad647c65f0db565", + "av_content_type": "video", + "av_institution": "KiKA", + "av_institution_id": "urn:ard:institution:4ef58479de880838", + "av_publisher": "KiKA", + "av_publisher_id": "urn:ard:publisher:d974dc16b65aef8b", + "av_show": "Sesamstraße Magazin", + "av_show_id": "urn:ard:show:6d28705b69b83872" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.ln.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.hq.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/0928/TV-20210928-1420-0200.hd.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://adaptive.ndr.de/i/geo/2021/0928/TV-20210928-1420-0200.,hq,hd,ln,mn,ao,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.ln.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.hd.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://adaptive.ndr.de/i/geo/2021/1001/TV-20211001-1625-4000.,hq,hd,ln,mn,ao,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2021/1001/TV-20211001-1625-4000.hq.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + }, + { + "kind": "sign-language", + "kindName": "DGS", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.ln.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://adaptive.ndr.de/i/geo/2022/0104/TV-20220104-0902-5000.,hq,hd,ln,mn,ao,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.hd.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive_geo/2022/0104/TV-20220104-0902-5000.hq.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "dgs" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:eaa2ed13a677cd00" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:eaa2ed13a677cd00.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjkvZ2ViYWVyZGVuc3ByYWNoZQ?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "KiKA", + "logo": { + "title": "Logo KiKA", + "alt": "Logo KiKA", + "producerName": "Logo KiKA", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "KiKa", + "id": "b3JnYW5pemF0aW9uX0tpS0E", + "coreId": "urn:ard:publisher:d974dc16b65aef8b" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Die schlaflose Eule (mit Gebärdensprache)", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjkvZ2ViYWVyZGVuc3ByYWNoZQ?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL25kci5kZS80NDQw", + "title": "Sesamstraße Magazin", + "image": { + "alt": "Logo der Sendung Sesamstraße", + "producerName": "NDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:0aaf50e00c831d8f?w={width}&ch=bf49a3d17d79a407", + "title": "Sesamstraße Magazin" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "DGS", + "AD" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "2893. Ernie & Jan Delay bringen den müden Bert mit ihrem Lied um seinen nächtlichen Schlaf.\nIn einer neuen Sesamstraßen Reihe nehmen uns Kinder mit an ihre \"Lieblingsorte\". Heute besuchen wir mit Elli (4), Jonathan (5) und Mattis (8) das nächtliche Miniaturwunderland.\nAußerdem hat der Prinz Probleme damit, Dornröschen zu wecken und Krümelmonster bringt Abby zur Verzweiflung. Susi Schraube erfindet eine Maschine, die beim Einschlafen hilft.", + "title": "Die schlaflose Eule (mit Gebärdensprache)", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Die schlaflose Eule (mit Gebärdensprache)", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL25kci5kZS80NDQw", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 353 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL25kci5kZS80NDQw", + "urlId": "Y3JpZDovL25kci5kZS80NDQw", + "title": "Sesamstraße Magazin", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL25kci5kZS80NDQw?excludedAssetIds=Y3JpZDovL25kci5kZS82ZDdlMGFkMC00OGQ5LTRmYTMtYjdiMy04NDYzZTg4ODkyYjkvZ2ViYWVyZGVuc3ByYWNoZQ&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Sesamstraße Magazin", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL25kci5kZS80NDQw", + "widget_title": "Sesamstraße Magazin", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_DGS_UT_AD.json b/src/test/resources/ard/ard_item_DGS_UT_AD.json new file mode 100644 index 000000000..66639f201 --- /dev/null +++ b/src/test/resources/ard/ard_item_DGS_UT_AD.json @@ -0,0 +1,909 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "FSK12", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Der Fluch des Geldes (mit Gebärdensprache)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWi9nZWJhZXJkZW5zcHJhY2hl?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Der Fluch des Geldes (mit Gebärdensprache)", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Der Fluch des Geldes (mit Gebärdensprache)", + "mediaType": "video", + "lra": "ARD", + "channel": "ARD", + "show": "Tatort", + "contentTypes": "GD | UT", + "mediaDistributionType": 1, + "contentId": 13100815, + "metadataId": "crid://daserste.de/tatort/2024-01-28_20-15-MEZ/gebaerdensprache", + "clipLength": 5313 + }, + "chapter2": "Player", + "chapter3": "Tatort", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Tatort/Der Fluch des Geldes (mit Gebärdensprache)/13100815/20240128_1915", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:abb02a54f8711468", + "page_content_title": "Der Fluch des Geldes (mit Gebärdensprache)", + "page_id": "player_ondemand-page-ard", + "page_institution": "ARD", + "page_institution_id": "urn:ard:institution:453603d77920d274", + "page_publisher": "ARD", + "page_publisher_id": "urn:ard:publisher:d6c3befc4d6b7e76", + "page_show": "Tatort", + "page_show_id": "urn:ard:show:24a41843cd919fb8", + "page_title": "Der Fluch des Geldes (mit Gebärdensprache)", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2025-01-28T19:15:00Z", + "binaryFeatures": [ + "DGS", + "UT", + "AD" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-01-28T19:15:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWi9nZWJhZXJkZW5zcHJhY2hl", + "image": { + "alt": "Hauptkommissar Leo Hölzer (Vladimir Burlakov,li.) sagt seinem Kollegen Hauptkommissar Adam Schürk (Daniel Sträßer), dass er nicht an einen Unfall glaubt.", + "producerName": "SR / Manuela Meyer", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:355b22d986951f5e?w={width}&ch=177f66b8952ac44e", + "title": "Hauptkommissar Leo Hölzer sagt seinem Kollegen Hauptkommissar Adam Schürk, dass er nicht an einen Unfall glaubt." + }, + "isChildContent": false, + "maturityContentRating": "FSK12", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2025-01-28T19:15:00Z", + "broadcastedOnDateTime": "2024-01-28T18:40:00Z", + "clipSourceName": "deg", + "durationSeconds": 5313, + "images": [ + { + "alt": "Hauptkommissar Leo Hölzer (Vladimir Burlakov,li.) sagt seinem Kollegen Hauptkommissar Adam Schürk (Daniel Sträßer), dass er nicht an einen Unfall glaubt.", + "aspectRatio": "16x9", + "imageSourceName": "SR / Manuela Meyer", + "kind": "preview", + "title": "Hauptkommissar Leo Hölzer sagt seinem Kollegen Hauptkommissar Adam Schürk, dass er nicht an einen Unfall glaubt.", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:355b22d986951f5e?w=960&ch=177f66b8952ac44e" + } + ], + "maturityContentRating": { + "age": 12, + "isBlocked": false, + "kind": "other" + }, + "publicationService": { + "id": "ard", + "name": "ARD", + "partner": "ard" + }, + "seriesTitle": "Tatort", + "synopsis": "Spielfilm Deutschland 2024 +++\r\n\r\n\"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. +++\r\n\r\nMit Vladimir Burlakov, Daniel Sträßer, Susanne Bormann, Omar El-Saeidi, Jasmina Al Zihairi u.a. | Buch: Hendrik Hölzemann | Regie: Christian Theede", + "title": "Der Fluch des Geldes" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWg" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13100815", + "length": "5313", + "nol_c0": "p0,0", + "nol_c10": "p10,ARD", + "nol_c12": "p12,Content", + "nol_c15": "p15,X005428862", + "nol_c16": "p16,Das Erste_f|film|sonntagskrimi|crid://daserste.de/tatort", + "nol_c18": "p18,N", + "nol_c19": "p19,deg", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://daserste.de/tatort/2024-01-28_20-15-MEZ", + "nol_c8": "p8,5313", + "nol_c9": "p9,Tatort_Der Fluch des Geldes_28.01.2024 19:15", + "program": "Tatort", + "title": "ARD_Tatort_Der Fluch des Geldes_28.01.2024 19:15", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "5313", + "mediaLabel": "Der Fluch des Geldes__13100815__AD | GD | UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "ARD", + "mediaTheme2": "ARD", + "mediaTheme3": "Tatort", + "mediaType": "video", + "playerId": "urn:ard:publication:abb02a54f8711468", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Der Fluch des Geldes", + "av_content_duration": 5313000, + "av_content_id": "urn:ard:publication:abb02a54f8711468", + "av_content_type": "video", + "av_institution": "ARD", + "av_institution_id": "urn:ard:institution:453603d77920d274", + "av_publisher": "ARD", + "av_publisher_id": "urn:ard:publisher:d6c3befc4d6b7e76", + "av_show": "Tatort", + "av_show_id": "urn:ard:show:24a41843cd919fb8" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://universal-vod.daserste.de/i/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/,JOB_430813_sendeton_640x360-50p-1200kbit,JOB_430813_sendeton_480x270-50p-700kbit,JOB_430813_sendeton_960x540-50p-1600kbit,JOB_430813_sendeton_1280x720-50p-3200kbit,JOB_430813_sendeton_1920x1080-50p-5000kbit,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_1920x1080-50p-5000kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_1280x720-50p-3200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_960x540-50p-1600kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_640x360-50p-1200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_640x360-50p-1200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_1280x720-50p-3200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_1920x1080-50p-5000kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://universal-vod.daserste.de/i/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/,JOB_430814_internationalerton_640x360-50p-1200kbit,JOB_430814_internationalerton_480x270-50p-700kbit,JOB_430814_internationalerton_960x540-50p-1600kbit,JOB_430814_internationalerton_1280x720-50p-3200kbit,JOB_430814_internationalerton_1920x1080-50p-5000kbit,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_960x540-50p-1600kbit.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + }, + { + "kind": "sign-language", + "kindName": "DGS", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_960x540-50p-1600kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_1920x1080-50p-5000kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_640x360-50p-1200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pd-videos.daserste.de/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/JOB_432151_sendeton_1280x720-50p-3200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://universal-vod.daserste.de/i/int/2024/01/24/03247ab1-4dcc-427e-b577-a6ca25c1dffe/,JOB_432151_sendeton_640x360-50p-1200kbit,JOB_432151_sendeton_480x270-50p-700kbit,JOB_432151_sendeton_960x540-50p-1600kbit,JOB_432151_sendeton_1280x720-50p-3200kbit,JOB_432151_sendeton_1920x1080-50p-5000kbit,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "dgs" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:7b0043ec0b358eb8" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:7b0043ec0b358eb8.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWi9nZWJhZXJkZW5zcHJhY2hl?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "ARD", + "logo": { + "title": "Logo ARD", + "alt": "Logo ARD", + "producerName": "Logo ARD", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "ard", + "id": "b3JnYW5pemF0aW9uX0FSRA", + "coreId": "urn:ard:publisher:d6c3befc4d6b7e76" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Der Fluch des Geldes (mit Gebärdensprache)", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWi9nZWJhZXJkZW5zcHJhY2hl?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA", + "title": "Tatort", + "image": { + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a8959bc57bedd88a?w={width}&ch=389e8f7aef781c55", + "title": "\"Tatort\"-Logo" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "DGS", + "AD" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Spielfilm Deutschland 2024 +++\r\n\r\n\"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. +++\r\n\r\nMit Vladimir Burlakov, Daniel Sträßer, Susanne Bormann, Omar El-Saeidi, Jasmina Al Zihairi u.a. | Buch: Hendrik Hölzemann | Regie: Christian Theede", + "title": "Der Fluch des Geldes (mit Gebärdensprache)", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Der Fluch des Geldes (mit Gebärdensprache)", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 736 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA", + "urlId": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA", + "title": "Tatort", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA?excludedAssetIds=Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydC8yMDI0LTAxLTI4XzIwLTE1LU1FWi9nZWJhZXJkZW5zcHJhY2hl&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [ + { + "availableTo": "2024-07-30T19:45:00Z", + "binaryFeatures": [ + "UT" + ], + "broadcastedOn": "2024-06-04T18:15:00Z", + "coreAssetType": "EPISODE", + "duration": 5314, + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "images": { + "aspect16x9": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:27e385089acb1dcc?w={width}&ch=93fd6a5deb45a997", + "title": "Spargelzeit" + }, + "aspect16x7": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:f42df5508e275d92?w={width}&ch=e61daec90b9ef9e4", + "title": "Spargelzeit" + }, + "aspect1x1": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:3852f8909d44c9b3?w={width}&ch=0f686333d1007294", + "title": "Spargelzeit" + } + }, + "isChildContent": false, + "longTitle": "Spargelzeit (2010)", + "maturityContentRating": "FSK12", + "mediumTitle": "Spargelzeit (2010)", + "personalized": false, + "playtime": null, + "publicationService": { + "name": "WDR", + "logo": { + "title": "Logo WDR", + "alt": "Logo WDR", + "producerName": "Logo WDR", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "wdr", + "id": "b3JnYW5pemF0aW9uX1dEUg", + "coreId": "urn:ard:publisher:10b1059a7b59f1da" + }, + "links": { + "self": { + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "urlId": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "title": "Spargelzeit (2010)", + "href": "https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "type": "application/vnd.ard.teaser+json", + "partner": "ard" + }, + "target": { + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "urlId": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "title": "Spargelzeit (2010)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ?devicetype=pc&embedded=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "shortTitle": "Spargelzeit (2010)", + "show": { + "id": "crid://daserste.de/tatort", + "coremediaId": 602916, + "title": "Tatort", + "publisher": { + "name": "ARD", + "logo": { + "title": "Logo ARD", + "alt": "Logo ARD", + "producerName": "Logo ARD", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "ard", + "id": "b3JnYW5pemF0aW9uX0FSRA", + "coreId": "urn:ard:publisher:d6c3befc4d6b7e76" + }, + "self": null, + "images": { + "16x9": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a8959bc57bedd88a?w={width}&ch=389e8f7aef781c55", + "aspectRatio": "16x9" + }, + "16x7": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:57559fd8493b090e?w={width}&ch=bfa7f51159a70920", + "aspectRatio": "16x7" + }, + "1x1": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:4c55e01954532da6?w={width}&ch=b8eff11ee60b8401", + "aspectRatio": "1x1" + }, + "3x4": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c82ca21f13bac66f?w={width}&ch=81a039028bec1df2", + "aspectRatio": "3x4" + } + }, + "shortSynopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "synopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "longSynopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "modificationDate": null, + "assetSource": null, + "categories": null, + "categoryIds": null, + "coreAssetType": "INFINITE_SERIES", + "coreId": "urn:ard:show:24a41843cd919fb8", + "groupingType": "SHOW", + "homepage": { + "id": null, + "title": "Tatort", + "href": "https://www.daserste.de/unterhaltung/krimi/tatort/index.html", + "type": null + }, + "hasSeasons": false, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "DGS", + "AD" + ], + "isChildContent": false + }, + "subtitled": true, + "titleVisible": true, + "trackingPiano": { + "teaser_content_type": "ondemand", + "teaser_id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLThlNjczODVlLWZhZTktNDMwYi1iNzI1LTA0NjU1ZmRmMDljZQ", + "teaser_institution": "ARD", + "teaser_institution_id": "urn:ard:institution:453603d77920d274", + "teaser_title": "Spargelzeit (2010)" + }, + "type": "ondemand" + }, + { + "availableTo": "2024-07-30T19:45:00Z", + "binaryFeatures": [ + "UT" + ], + "broadcastedOn": "2024-06-04T18:15:00Z", + "coreAssetType": "EXTRA_BONUS_CONTENT", + "duration": 5314, + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "images": { + "aspect16x9": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:2fc98995629a7208?w={width}&ch=95de7feef876cb78", + "title": "Spargelzeit" + }, + "aspect16x7": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:8b4b569409819ac9?w={width}&ch=7a595d0301f1bf55", + "title": "Spargelzeit" + }, + "aspect1x1": { + "alt": "Prof. Karl-Friedrich Boerne (Jan Josef Liefers), Vater Thiel (Claus D. Clausnitzer) und Frank Thiel (Axel Prahl) essen gemeinsam Spargel.", + "producerName": "WDR/Martin Menke", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:9cd82a97a7cc54f1?w={width}&ch=c9a3fd5f1799e8a4", + "title": "Spargelzeit" + } + }, + "isChildContent": false, + "longTitle": "Spargelzeit (2010) (klare Sprache)", + "maturityContentRating": "FSK12", + "mediumTitle": "Spargelzeit (2010) (klare Sprache)", + "personalized": false, + "playtime": null, + "publicationService": { + "name": "WDR", + "logo": { + "title": "Logo WDR", + "alt": "Logo WDR", + "producerName": "Logo WDR", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "wdr", + "id": "b3JnYW5pemF0aW9uX1dEUg", + "coreId": "urn:ard:publisher:10b1059a7b59f1da" + }, + "links": { + "self": { + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "urlId": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "title": "Spargelzeit (2010) (klare Sprache)", + "href": "https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "type": "application/vnd.ard.teaser+json", + "partner": "ard" + }, + "target": { + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "urlId": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "title": "Spargelzeit (2010) (klare Sprache)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5?devicetype=pc&embedded=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "shortTitle": "Spargelzeit (2010) (klare Sprache)", + "show": { + "id": "crid://daserste.de/tatort", + "coremediaId": 602916, + "title": "Tatort", + "publisher": { + "name": "ARD", + "logo": { + "title": "Logo ARD", + "alt": "Logo ARD", + "producerName": "Logo ARD", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "ard", + "id": "b3JnYW5pemF0aW9uX0FSRA", + "coreId": "urn:ard:publisher:d6c3befc4d6b7e76" + }, + "self": null, + "images": { + "16x9": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a8959bc57bedd88a?w={width}&ch=389e8f7aef781c55", + "aspectRatio": "16x9" + }, + "16x7": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:57559fd8493b090e?w={width}&ch=bfa7f51159a70920", + "aspectRatio": "16x7" + }, + "1x1": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:4c55e01954532da6?w={width}&ch=b8eff11ee60b8401", + "aspectRatio": "1x1" + }, + "3x4": { + "title": "\"Tatort\"-Logo", + "alt": "\"Tatort\"-Logo", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c82ca21f13bac66f?w={width}&ch=81a039028bec1df2", + "aspectRatio": "3x4" + } + }, + "shortSynopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "synopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "longSynopsis": "In der dienstältesten Krimireihe des deutschen Fernsehens gehen die unterschiedlichsten Ermittlertypen auf Verbrecherjagd. ", + "modificationDate": null, + "assetSource": null, + "categories": null, + "categoryIds": null, + "coreAssetType": "INFINITE_SERIES", + "coreId": "urn:ard:show:24a41843cd919fb8", + "groupingType": "SHOW", + "homepage": { + "id": null, + "title": "Tatort", + "href": "https://www.daserste.de/unterhaltung/krimi/tatort/index.html", + "type": null + }, + "hasSeasons": false, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "DGS", + "AD" + ], + "isChildContent": false + }, + "subtitled": true, + "titleVisible": true, + "trackingPiano": { + "teaser_content_type": "ondemand", + "teaser_id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtZWRmMTRhM2UtNmM3Ny00NGZhLTg1ZWYtYTJkYmZmNzM0NTg5", + "teaser_institution": "ARD", + "teaser_institution_id": "urn:ard:institution:453603d77920d274", + "teaser_title": "Spargelzeit (2010) (klare Sprache)" + }, + "type": "ondemand" + } + ], + "title": "Tatort", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhdG9ydA", + "widget_title": "Tatort", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_AD_DasErste.json b/src/test/resources/ard/ard_item_STD_AD_DasErste.json new file mode 100644 index 000000000..ebe70f803 --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_AD_DasErste.json @@ -0,0 +1,504 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "FSK12", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Folge 3: Die Bestechlichen (S05/E03)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Folge 3: Die Bestechlichen (S05/E03)", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Folge 3: Die Bestechlichen (S05/E03)", + "mediaType": "video", + "lra": "Das Erste", + "channel": "Das Erste", + "show": "Mord mit Aussicht ", + "contentTypes": "UT", + "mediaDistributionType": 1, + "contentId": 13309263, + "metadataId": "crid://wdr.de/Beitrag-sophora-08b53490-7ef3-4a58-84a5-57f15f4f0ab1", + "clipLength": 2840 + }, + "chapter2": "Player", + "chapter3": "Mord mit Aussicht ", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Mord mit Aussicht /Folge 3: Die Bestechlichen (S05/E03)/13309263/20240430_1815", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:2da2fc7b79f58993", + "page_content_title": "Folge 3: Die Bestechlichen (S05/E03)", + "page_id": "player_ondemand-page-ard", + "page_institution": "Das Erste", + "page_institution_id": "urn:ard:institution:59ccb6ea77d75af5", + "page_publisher": "Das Erste", + "page_publisher_id": "urn:ard:publisher:a42e4291cd9eaf0b", + "page_show": "Mord mit Aussicht ", + "page_show_id": "urn:ard:show:2f97918e83660f77", + "page_title": "Folge 3: Die Bestechlichen (S05/E03)", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2025-05-28T18:15:00Z", + "binaryFeatures": [ + "UT", + "AD" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-04-30T18:15:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx", + "image": { + "alt": "Jenny Dickel (Eva Bühnen, h.), Marie Gabler (Katharina Wackernagel, M.) und Heino Fuß (Sebastian Schwarz, v.) observieren Evi Schmadalla auf dem Hof von Kai Appel.", + "producerName": "ARD/Frank Dicks", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:745002c4c35c4413?w={width}&ch=4cd4b713f932a703", + "title": "Mord mit Aussicht (S05/E03) - Die Bestechlichen" + }, + "isChildContent": false, + "maturityContentRating": "FSK12", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2025-05-28T18:15:00Z", + "broadcastedOnDateTime": "2024-04-16T03:30:00Z", + "clipSourceName": "WDR", + "durationSeconds": 2840, + "images": [ + { + "alt": "Jenny Dickel (Eva Bühnen, h.), Marie Gabler (Katharina Wackernagel, M.) und Heino Fuß (Sebastian Schwarz, v.) observieren Evi Schmadalla auf dem Hof von Kai Appel.", + "aspectRatio": "16x9", + "imageSourceName": "ARD/Frank Dicks", + "kind": "preview", + "title": "Mord mit Aussicht (S05/E03) - Die Bestechlichen", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:745002c4c35c4413?w=960&ch=4cd4b713f932a703" + } + ], + "maturityContentRating": { + "age": 12, + "isBlocked": false, + "kind": "other" + }, + "publicationService": { + "id": "ard", + "name": "Das Erste", + "partner": "daserste" + }, + "seriesTitle": "Mord mit Aussicht ", + "synopsis": "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.\n\nDer 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 einer verängstigten jungen Bulgarin auf Gisberts Hof verkompliziert nicht nur den Fall, sondern auch die private Harmonie zwischen Gisbert und Marie.", + "title": "Folge 3: Die Bestechlichen" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13309263", + "length": "2840", + "nol_c0": "p0,0", + "nol_c10": "p10,Das Erste", + "nol_c12": "p12,Content", + "nol_c15": "p15,X005424422", + "nol_c16": "p16,", + "nol_c18": "p18,N", + "nol_c19": "p19,WDR", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://wdr.de/poc_import_4001396934_ganzeSendung", + "nol_c8": "p8,2840", + "nol_c9": "p9,Mord mit Aussicht _Folge 3: Die Bestechlichen_30.04.2024 18:15", + "program": "Mord mit Aussicht ", + "title": "Das Erste_Mord mit Aussicht _Folge 3: Die Bestechlichen_30.04.2024 18:15", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "2840", + "mediaLabel": "Folge 3: Die Bestechlichen__13309263__AD | UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Das Erste", + "mediaTheme2": "Das Erste", + "mediaTheme3": "Mord mit Aussicht ", + "mediaType": "video", + "playerId": "urn:ard:publication:2da2fc7b79f58993", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Folge 3: Die Bestechlichen", + "av_content_duration": 2840000, + "av_content_id": "urn:ard:publication:2da2fc7b79f58993", + "av_content_type": "video", + "av_institution": "Das Erste", + "av_institution_id": "urn:ard:institution:59ccb6ea77d75af5", + "av_publisher": "Das Erste", + "av_publisher_id": "urn:ard:publisher:a42e4291cd9eaf0b", + "av_show": "Mord mit Aussicht ", + "av_show_id": "urn:ard:show:2f97918e83660f77" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk12/310/3101569/,3101569_56955169,3101569_56955170,3101569_56955168,3101569_56955171,3101569_56955167,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955170.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955167.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955171.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_56955169.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101825.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://wdradaptiv-vh.akamaihd.net/i/medp/ondemand/weltweit/fsk12/310/3101569/,3101569_57101825,3101569_57101826,3101569_57101824,3101569_57101827,3101569_57101823,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101826.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101827.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/weltweit/fsk12/310/3101569/3101569_57101823.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:a1d11ac623c7d120" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:a1d11ac623c7d120.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "Das Erste", + "logo": { + "title": "Logo Das Erste", + "alt": "Logo Das Erste", + "producerName": "Logo Das Erste", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "das_erste", + "id": "b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ", + "coreId": "urn:ard:publisher:a42e4291cd9eaf0b" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Folge 3: Die Bestechlichen (S05/E03)", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA", + "title": "Mord mit Aussicht ", + "image": { + "alt": "Zwei Polizistinnen und ein Polizist stehen in einer grünen Szene, auf dem Bild der Schriftzug \"Mord mit Aussicht\"", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:7bf8f348c5406992?w={width}&ch=3fce2348c6a8a931", + "title": "Neues Sendungslogo Mord mit Aussicht" + }, + "availableSeasons": [ + "1", + "2", + "3", + "4", + "5" + ], + "binaryFeatures": [ + "UT", + "AD" + ], + "coreAssetType": "SEASON_SERIES" + }, + "synopsis": "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.\n\nDer 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 einer verängstigten jungen Bulgarin auf Gisberts Hof verkompliziert nicht nur den Fall, sondern auch die private Harmonie zwischen Gisbert und Marie.", + "title": "Folge 3: Die Bestechlichen (S05/E03)", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Folge 3: Die Bestechlichen (S05/E03)", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 68 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA", + "urlId": "Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA", + "title": "Mord mit Aussicht ", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA?excludedAssetIds=Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtMDhiNTM0OTAtN2VmMy00YTU4LTg0YTUtNTdmMTVmNGYwYWIx&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Mord mit Aussicht ", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL3dkci5kZS9tb3JkIG1pdCBhdXNzaWNodA", + "widget_title": "Mord mit Aussicht ", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_AD_MDR.json b/src/test/resources/ard/ard_item_STD_AD_MDR.json new file mode 100644 index 000000000..a0e7a1122 --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_AD_MDR.json @@ -0,0 +1,460 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "FSK0", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Reichsbahn-Oldies im Trend", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Reichsbahn-Oldies im Trend", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Reichsbahn-Oldies im Trend", + "mediaType": "video", + "lra": "MDR", + "channel": "MDR-Fernsehen", + "show": "Auf schmaler Spur", + "contentTypes": "UT", + "mediaDistributionType": 1, + "contentId": 13353889, + "metadataId": "crid://mdr.de/sendung/282040/446355-426782", + "clipLength": 1771 + }, + "chapter2": "Player", + "chapter3": "Auf schmaler Spur", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Auf schmaler Spur/Reichsbahn-Oldies im Trend/13353889/20240501_1120", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:33ebd0e3de3385e5", + "page_content_title": "Reichsbahn-Oldies im Trend", + "page_id": "player_ondemand-page-ard", + "page_institution": "MDR", + "page_institution_id": "urn:ard:institution:a8c3c85783443bee", + "page_publisher": "MDR-Fernsehen", + "page_publisher_id": "urn:ard:publisher:45fc99e7d133eb64", + "page_show": "Auf schmaler Spur", + "page_show_id": "urn:ard:show:584e22ba5174ebfc", + "page_title": "Reichsbahn-Oldies im Trend", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2025-05-01T10:35:00Z", + "binaryFeatures": [ + "UT", + "AD" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-05-01T11:20:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy", + "image": { + "alt": "Auf schmaler Spur: Reichsbahn-Oldies im Trend", + "producerName": "MITTELDEUTSCHER RUNDFUNK", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c7b6ecdc8f0e05b5?w={width}&ch=25beab5c724ed687", + "title": "Auf schmaler Spur: Reichsbahn-Oldies im Trend" + }, + "isChildContent": false, + "maturityContentRating": "FSK0", + "mediaCollection": { + "embedded": { + "isGeoBlocked": true, + "meta": { + "availableToDateTime": "2025-05-01T10:35:00Z", + "broadcastedOnDateTime": "2023-05-18T11:50:00Z", + "clipSourceName": "MDR", + "durationSeconds": 1771, + "images": [ + { + "alt": "Auf schmaler Spur: Reichsbahn-Oldies im Trend", + "aspectRatio": "16x9", + "imageSourceName": "MITTELDEUTSCHER RUNDFUNK", + "kind": "preview", + "title": "Auf schmaler Spur: Reichsbahn-Oldies im Trend", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c7b6ecdc8f0e05b5?w=960&ch=25beab5c724ed687" + } + ], + "maturityContentRating": { + "age": 0, + "isBlocked": false, + "kind": "other" + }, + "publicationService": { + "id": "ard", + "name": "MDR-Fernsehen", + "partner": "mdr" + }, + "seriesTitle": "Auf schmaler Spur", + "synopsis": "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.\n\nAuch in Löbau ist der Nachwuchs schon in der Verantwortung. Max und Phillip, Mitte 20, sind bei den Ostsächsischen Eisenbahnfreunden Heizer auf der Dampflok. Ihre fast 80 Jahre alte Lok der Baureihe 52 hat im Dampflokwerk Meiningen eine Generalüberholung bekommen. Nun soll sie zurück in die Lausitz. Max und Phillip sind bei der Überführung dabei und wollen ihre erste große Bewährungsprobe meistern.\n\nAuch in der Modellbahnszene gehören die 52er Dampfloks und die Ludmillas zu den besonders liebevoll gepflegten Exemplaren. Frank Jachmann und seine Mitstreiter vom Eisenbahnclub Leinefelde lassen zudem auf ihrer riesigen Anlage besonders lange Züge fahren, detailgetreu zusammengestellt wie zu Reichsbahn-Zeiten. \nDer Generationenwechsel ist da: Rund um junge Eisenbahnerinnen und Eisenbahner erzählen wir die Geschichte der Lokomotiven, die aus dem Verkehr der Reichsbahn nicht wegzudenken waren. Und wie sie nun die Herzen von jungen Menschen erobern – an der Strecke und auf dem Führerstand.", + "title": "Reichsbahn-Oldies im Trend" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13353889", + "length": "1771", + "nol_c0": "p0,0", + "nol_c10": "p10,MDR-Fernsehen", + "nol_c12": "p12,Content", + "nol_c15": "p15,430/24/002.854.787", + "nol_c16": "p16,ARD_Sonstiges", + "nol_c18": "p18,N", + "nol_c19": "p19,MDR", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://mdr.de/sendung/282040/446355-426782", + "nol_c8": "p8,1771", + "nol_c9": "p9,Auf schmaler Spur_Reichsbahn-Oldies im Trend_01.05.2024 11:20", + "program": "Auf schmaler Spur", + "title": "MDR-Fernsehen_Auf schmaler Spur_Reichsbahn-Oldies im Trend_01.05.2024 11:20", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "1771", + "mediaLabel": "Reichsbahn-Oldies im Trend__13353889__AD | UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Mitteldeutscher Rundfunk", + "mediaTheme2": "MDR-Fernsehen", + "mediaTheme3": "Auf schmaler Spur", + "mediaType": "video", + "playerId": "urn:ard:publication:33ebd0e3de3385e5", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Reichsbahn-Oldies im Trend", + "av_content_duration": 1771000, + "av_content_id": "urn:ard:publication:33ebd0e3de3385e5", + "av_content_type": "video", + "av_institution": "MDR", + "av_institution_id": "urn:ard:institution:a8c3c85783443bee", + "av_publisher": "MDR-Fernsehen", + "av_publisher_id": "urn:ard:publisher:45fc99e7d133eb64", + "av_show": "Auf schmaler Spur", + "av_show_id": "urn:ard:show:584e22ba5174ebfc" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-41dd60577440_a6.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://mdrgeohls-vh.akamaihd.net/i/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-,41dd60577440,730aae549c28,be7c2950aac6,39c393010ca9,_a6.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-730aae549c28_a6.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/a/FCMS-a66d00f7-05d6-4280-8dbe-9c81a47c8667-be7c2950aac6_a6.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-730aae549c28_25.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-be7c2950aac6_25.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://odgeomdr-a.akamaihd.net/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-41dd60577440_25.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://mdrgeohls-vh.akamaihd.net/i/mp4dyn2/2/FCMS-25d93e81-d91a-40f7-92a7-90b28b675943-,41dd60577440,730aae549c28,be7c2950aac6,39c393010ca9,_25.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:7d1c01087f8cae77" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:7d1c01087f8cae77.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "MDR-Fernsehen", + "logo": { + "title": "Logo MDR-Fernsehen", + "alt": "Logo MDR-Fernsehen", + "producerName": "Logo MDR-Fernsehen", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "mdr", + "id": "b3JnYW5pemF0aW9uX01EUg", + "coreId": "urn:ard:publisher:45fc99e7d133eb64" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Reichsbahn-Oldies im Trend", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI", + "title": "Auf schmaler Spur", + "image": { + "alt": "Sendungslogo Auf schmaler Spur", + "producerName": "MITTELDEUTSCHER RUNDFUNK", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:f79a82428b4ef483?w={width}&ch=55141de2d1f1caf6", + "title": "Auf schmaler Spur - Sendereihenbild" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "AD" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "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.\n\nAuch in Löbau ist der Nachwuchs schon in der Verantwortung. Max und Phillip, Mitte 20, sind bei den Ostsächsischen Eisenbahnfreunden Heizer auf der Dampflok. Ihre fast 80 Jahre alte Lok der Baureihe 52 hat im Dampflokwerk Meiningen eine Generalüberholung bekommen. Nun soll sie zurück in die Lausitz. Max und Phillip sind bei der Überführung dabei und wollen ihre erste große Bewährungsprobe meistern.\n\nAuch in der Modellbahnszene gehören die 52er Dampfloks und die Ludmillas zu den besonders liebevoll gepflegten Exemplaren. Frank Jachmann und seine Mitstreiter vom Eisenbahnclub Leinefelde lassen zudem auf ihrer riesigen Anlage besonders lange Züge fahren, detailgetreu zusammengestellt wie zu Reichsbahn-Zeiten. \nDer Generationenwechsel ist da: Rund um junge Eisenbahnerinnen und Eisenbahner erzählen wir die Geschichte der Lokomotiven, die aus dem Verkehr der Reichsbahn nicht wegzudenken waren. Und wie sie nun die Herzen von jungen Menschen erobern – an der Strecke und auf dem Führerstand.", + "title": "Reichsbahn-Oldies im Trend", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Reichsbahn-Oldies im Trend", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 11 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI", + "urlId": "Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI", + "title": "Auf schmaler Spur", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI?excludedAssetIds=Y3JpZDovL21kci5kZS9zZW5kdW5nLzI4MjA0MC80NDYzNTUtNDI2Nzgy&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Auf schmaler Spur", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL21kci5kZS9zZW5kZXJlaWhlbi8yMDBhMThlMC0yY2EzLTQ1MzktOGY1Zi0zN2VhY2UzNDE3ZWI", + "widget_title": "Auf schmaler Spur", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_AD_SWR.json b/src/test/resources/ard/ard_item_STD_AD_SWR.json new file mode 100644 index 000000000..862ddb19d --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_AD_SWR.json @@ -0,0 +1,482 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "FSK0", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "mediaType": "video", + "lra": "SWR", + "channel": "SWR", + "show": "Traumziele", + "contentTypes": "", + "mediaDistributionType": 1, + "contentId": 13288709, + "metadataId": "crid://swr.de/aex/o2029736", + "clipLength": 2635 + }, + "chapter2": "Player", + "chapter3": "Traumziele", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Traumziele/Im Herzen Italiens - Von den Abruzzen nach Kalabrien/13288709/20240501_1215", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:74bb0ec9016ff8a5", + "page_content_title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "page_id": "player_ondemand-page-ard", + "page_institution": "SWR", + "page_institution_id": "urn:ard:institution:a3004ff924ece1a2", + "page_publisher": "SWR", + "page_publisher_id": "urn:ard:publisher:6478b1e3557817e3", + "page_show": "Traumziele", + "page_show_id": "urn:ard:show:f8bbf1ada8504543", + "page_title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2024-05-29T14:00:00Z", + "binaryFeatures": [ + "AD" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-05-01T12:15:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY", + "image": { + "alt": "Wilde Pferde in den Bergen des Apennin. In in diesem Teil Italiens gibt es noch zahlreiche archaische Landschaften.", + "producerName": "SWR, Berlin Producers Media/Gero von Schneider-Marientreu", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:66948bb89532aeb3?w={width}&ch=e65949c85ee2c39d", + "title": "Wilde Pferde in den Bergen des Apennin. In in diesem Teil Italiens gibt es noch zahlreiche archaische Landschaften." + }, + "isChildContent": false, + "maturityContentRating": "FSK0", + "mediaCollection": { + "embedded": { + "isGeoBlocked": true, + "meta": { + "availableToDateTime": "2024-05-29T14:00:00Z", + "broadcastedOnDateTime": "2024-04-30T14:00:00Z", + "clipSourceName": "10804", + "durationSeconds": 2635, + "images": [ + { + "alt": "Wilde Pferde in den Bergen des Apennin. In in diesem Teil Italiens gibt es noch zahlreiche archaische Landschaften.", + "aspectRatio": "16x9", + "imageSourceName": "SWR, Berlin Producers Media/Gero von Schneider-Marientreu", + "kind": "preview", + "title": "Wilde Pferde in den Bergen des Apennin. In in diesem Teil Italiens gibt es noch zahlreiche archaische Landschaften.", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:66948bb89532aeb3?w=960&ch=e65949c85ee2c39d" + } + ], + "maturityContentRating": { + "age": 0, + "isBlocked": false, + "kind": "other" + }, + "publicationService": { + "id": "ard", + "name": "SWR", + "partner": "swr" + }, + "seriesTitle": "Traumziele", + "synopsis": "Der Apennin ist das Rückgrat und die Seele Italiens. Orte voller Geschichte und wilde Natur prägen das Land.", + "title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13288709", + "length": "2635", + "nol_c0": "p0,0", + "nol_c10": "p10,SWR", + "nol_c12": "p12,Content", + "nol_c15": "p15,4314471817812", + "nol_c16": "p16,ARD_Information", + "nol_c18": "p18,N", + "nol_c19": "p19,10804", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://swr.de/aex/o2029736", + "nol_c8": "p8,2635", + "nol_c9": "p9,Traumziele_Im Herzen Italiens - Von den Abruzzen nach Kalabrien_01.05.2024 12:15", + "program": "Traumziele", + "title": "SWR_Traumziele_Im Herzen Italiens - Von den Abruzzen nach Kalabrien_01.05.2024 12:15", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "2635", + "mediaLabel": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien__13288709__AD", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Südwestrundfunk", + "mediaTheme2": "SWR", + "mediaTheme3": "Traumziele", + "mediaType": "video", + "playerId": "urn:ard:publication:74bb0ec9016ff8a5", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "av_content_duration": 2635000, + "av_content_id": "urn:ard:publication:74bb0ec9016ff8a5", + "av_content_type": "video", + "av_institution": "SWR", + "av_institution_id": "urn:ard:institution:a3004ff924ece1a2", + "av_publisher": "SWR", + "av_publisher_id": "urn:ard:publisher:6478b1e3557817e3", + "av_show": "Traumziele", + "av_show_id": "urn:ard:show:f8bbf1ada8504543" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.xl.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.xxl.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.l.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.ml.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://av-adaptive.swr.de/i/swrfernsehen/geo/de/traumziele/2029736,.sm,.ml,.l,.xl,.xxl,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.xl.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://av-adaptive.swr.de/i/swrfernsehen/geo/de/traumziele/2029736.audio_description,.sm,.ml,.l,.xl,.xxl,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.ml.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.xxl.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "audio-description", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://pdodswr-a.akamaihd.net/swrfernsehen/geo/de/traumziele/2029736.audio_description.l.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "SWR", + "logo": { + "title": "Logo SWR", + "alt": "Logo SWR", + "producerName": "Logo SWR", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "swr", + "id": "b3JnYW5pemF0aW9uX1NXUg", + "coreId": "urn:ard:publisher:6478b1e3557817e3" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2", + "title": "Traumziele", + "image": { + "alt": "Sendungssignet \"Traumziele\"", + "producerName": "SWR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:af6c5760727f0cb0?w={width}&ch=9f816f887ce828f6", + "title": "Sendungssignet \"Traumziele\"" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "AD" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Der Apennin ist das Rückgrat und die Seele Italiens. Orte voller Geschichte und wilde Natur prägen das Land.", + "title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Im Herzen Italiens - Von den Abruzzen nach Kalabrien", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 64 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2", + "urlId": "Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2", + "title": "Traumziele", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2?excludedAssetIds=Y3JpZDovL3N3ci5kZS9hZXgvbzIwMjk3MzY&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Traumziele", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL3N3ci5kZS9zZGIvc3RJZC8xMzQ2", + "widget_title": "Traumziele", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_BR.json b/src/test/resources/ard/ard_item_STD_BR.json new file mode 100644 index 000000000..a29b90722 --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_BR.json @@ -0,0 +1,508 @@ +{ + "coreAssetType": "SECTION", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Van-Urlaub für 1 Euro: Wie geht das?", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Van-Urlaub für 1 Euro: Wie geht das?", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Van-Urlaub für 1 Euro: Wie geht das.", + "mediaType": "video", + "lra": "BR", + "channel": "BR.de", + "show": "PULS Reportage", + "contentTypes": "", + "mediaDistributionType": 1, + "contentId": 13365267, + "metadataId": "crid://br.de/video/19712f56-684f-4bba-95aa-ae5a6331d67b", + "clipLength": 1247 + }, + "chapter2": "Player", + "chapter3": "PULS Reportage", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/PULS Reportage/Van-Urlaub für 1 Euro: Wie geht das./13365267/20240501_1300", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:a7bc130881fcf351", + "page_content_title": "Van-Urlaub für 1 Euro: Wie geht das?", + "page_id": "player_ondemand-page-ard", + "page_institution": "BR", + "page_institution_id": "urn:ard:institution:95a02eb6cc4f3d59", + "page_publisher": "BR.de", + "page_publisher_id": "urn:ard:publisher:98144fe10248e510", + "page_show": "PULS Reportage", + "page_show_id": "urn:ard:show:2d0602cd86c69825", + "page_title": "Van-Urlaub für 1 Euro: Wie geht das?", + "site": "634408" + }, + "widgets": [ + { + "availableTo": null, + "binaryFeatures": [], + "blockedByFsk": false, + "broadcastedOn": "2024-05-01T13:00:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg", + "image": { + "alt": "Leah Nlemibe | Bild: BR", + "producerName": "BR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:6fb44d066ad5c033?w={width}&ch=287b98dffb1766db", + "title": "Van-Urlaub für 1 Euro: Wie geht das?" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "broadcastedOnDateTime": "2024-05-01T13:30:38.121Z", + "clipSourceName": "© Bayerischer Rundfunk", + "durationSeconds": 1247, + "images": [ + { + "alt": "Leah Nlemibe | Bild: BR", + "aspectRatio": "16x9", + "imageSourceName": "BR", + "kind": "preview", + "title": "Van-Urlaub für 1 Euro: Wie geht das?", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:7d26c02018c00f2a?w=960&ch=e94b4b000f00480f" + } + ], + "publicationService": { + "id": "ard", + "name": "BR.de", + "partner": "br" + }, + "synopsis": "Bei einer Relocation kann man sich für 1 Euro einen Mietwagen ausleihen und muss ihn dafür nur pünktlich zum nächsten Abholort bringen. Leah mietet sich einen Luxus-Van, mit dem sie in drei Tagen nach Italien fährt: Taugt's wirklich als Urlaub?", + "title": "Van-Urlaub für 1 Euro: Wie geht das?" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13365267", + "length": "1247", + "nol_c0": "p0,666", + "nol_c10": "p10,BR.de", + "nol_c12": "p12,Content", + "nol_c15": "p15,", + "nol_c16": "p16,", + "nol_c18": "p18,N", + "nol_c19": "p19,© Bayerischer Rundfunk", + "nol_c2": "p2,Y", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://br.de/video/19712f56-684f-4bba-95aa-ae5a6331d67b", + "nol_c8": "p8,1247", + "nol_c9": "p9,PULS Reportage_Van-Urlaub für 1 Euro: Wie geht das?_01.05.2024 13:30", + "program": "PULS Reportage", + "title": "BR.de_PULS Reportage_Van-Urlaub für 1 Euro: Wie geht das?_01.05.2024 13:30", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "1247", + "mediaLabel": "Van-Urlaub für 1 Euro: Wie geht das__13365267__", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Bayerischer Rundfunk", + "mediaTheme2": "BR.de", + "mediaTheme3": "PULS Reportage", + "mediaType": "video", + "playerId": "urn:ard:publication:a7bc130881fcf351", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Van-Urlaub für 1 Euro: Wie geht das?", + "av_content_duration": 1247000, + "av_content_id": "urn:ard:publication:a7bc130881fcf351", + "av_content_type": "video", + "av_institution": "BR", + "av_institution_id": "urn:ard:institution:95a02eb6cc4f3d59", + "av_publisher": "BR.de", + "av_publisher_id": "urn:ard:publisher:98144fe10248e510", + "av_show": "PULS Reportage", + "av_show_id": "urn:ard:show:2d0602cd86c69825" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_E.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_HD.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://br-i.akamaihd.net/i/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_,X,A,C,E,HD,.mp4.csmil/master.m3u8?__b__=200", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_C.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://cdn-storage.br.de/MUJIuUOVBwQIbtCCBLzGiLC1uwQoNA4p_29S/_-OS/_2Ff5y4f9K1S/19712f56-684f-4bba-95aa-ae5a6331d67b_X.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "BR.de", + "logo": { + "title": "Logo BR.de", + "alt": "Logo BR.de", + "producerName": "Logo BR.de", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "br", + "id": "b3JnYW5pemF0aW9uX0JS", + "coreId": "urn:ard:publisher:98144fe10248e510" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Van-Urlaub für 1 Euro: Wie geht das?", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA", + "title": "PULS Reportage", + "image": { + "alt": "Sendereihenbild \"PULS Reportage\" | Bild: BR/ Marc Seibold", + "producerName": "BR/ Marc Seibold", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:88e0393c7f64f0be?w={width}&ch=7acb95d04efb4b32", + "title": "PULS Reportage" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Bei einer Relocation kann man sich für 1 Euro einen Mietwagen ausleihen und muss ihn dafür nur pünktlich zum nächsten Abholort bringen. Leah mietet sich einen Luxus-Van, mit dem sie in drei Tagen nach Italien fährt: Taugt's wirklich als Urlaub?", + "title": "Van-Urlaub für 1 Euro: Wie geht das?", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Van-Urlaub für 1 Euro: Wie geht das?", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 532 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA", + "urlId": "Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA", + "title": "PULS Reportage", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA?excludedAssetIds=Y3JpZDovL2JyLmRlL3ZpZGVvLzE5NzEyZjU2LTY4NGYtNGJiYS05NWFhLWFlNWE2MzMxZDY3Yg&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [ + { + "availableTo": null, + "binaryFeatures": [], + "broadcastedOn": "2024-04-24T13:00:00Z", + "coreAssetType": "SECTION", + "duration": 1186, + "id": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "images": { + "aspect16x9": { + "alt": "Sebastian Meinberg | Bild: BR", + "producerName": "BR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:b4fd84428a3b4ce9?w={width}&ch=2b6603d5872cd3f4", + "title": "Reich werden mit KI?!" + } + }, + "isChildContent": false, + "longTitle": "Reich werden mit KI?!", + "maturityContentRating": "NONE", + "mediumTitle": "Reich werden mit KI?!", + "personalized": false, + "playtime": null, + "publicationService": { + "name": "BR.de", + "logo": { + "title": "Logo BR.de", + "alt": "Logo BR.de", + "producerName": "Logo BR.de", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "br", + "id": "b3JnYW5pemF0aW9uX0JS", + "coreId": "urn:ard:publisher:98144fe10248e510" + }, + "links": { + "self": { + "id": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "urlId": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "title": "Reich werden mit KI?!", + "href": "https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "type": "application/vnd.ard.teaser+json", + "partner": "ard" + }, + "target": { + "id": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "urlId": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "title": "Reich werden mit KI?!", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw?devicetype=pc&embedded=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "shortTitle": "Reich werden mit KI?!", + "show": { + "id": "crid://br.de/broadcastSeries/75f4020a-8f57-48fc-a5e5-ef67566b3400", + "coremediaId": 14913810, + "title": "PULS Reportage", + "publisher": { + "name": "BR.de", + "logo": { + "title": "Logo BR.de", + "alt": "Logo BR.de", + "producerName": "Logo BR.de", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "br", + "id": "b3JnYW5pemF0aW9uX0JS", + "coreId": "urn:ard:publisher:98144fe10248e510" + }, + "self": null, + "images": { + "16x9": { + "title": "PULS Reportage", + "alt": "Sendereihenbild \"PULS Reportage\" | Bild: BR/ Marc Seibold", + "producerName": "BR/ Marc Seibold", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:88e0393c7f64f0be?w={width}&ch=7acb95d04efb4b32", + "aspectRatio": "16x9" + }, + "16x7": { + "title": "PULS Reportage", + "alt": "Sendereihenbild \"PULS Reportage\" | Bild: BR/ Marc Seibold", + "producerName": "BR/ Marc Seibold", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:3f2df381ef21d401?w={width}&ch=b01b9b672a844ae9", + "aspectRatio": "16x7" + }, + "1x1": { + "title": "PULS Reportage", + "alt": "Sendereihenbild \"PULS Reportage\" | Bild: BR/ Marc Seibold", + "producerName": "BR/ Marc Seibold", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:8e0eeebd59340efe?w={width}&ch=f8da88c4b6f563f9", + "aspectRatio": "1x1" + } + }, + "shortSynopsis": "Wir sind Kevin Ebert, Ariane Alter, Sebastian Meinberg und Leah Nlemibe von PULS Reportage. Wir probieren aus, was euch bewegt! Jeden Mittwoch um 15 Uhr gibt’s hier eine neue Reportage.", + "synopsis": "Wir sind Kevin Ebert, Ariane Alter, Sebastian Meinberg und Leah Nlemibe von PULS Reportage. Wir probieren aus, was euch bewegt! Jeden Mittwoch um 15 Uhr gibt’s hier eine neue Reportage.", + "longSynopsis": "Wir sind Kevin Ebert, Ariane Alter, Sebastian Meinberg und Leah Nlemibe von PULS Reportage. Wir probieren aus, was euch bewegt! Jeden Mittwoch um 15 Uhr gibt’s hier eine neue Reportage.", + "modificationDate": null, + "assetSource": null, + "categories": null, + "categoryIds": null, + "coreAssetType": "INFINITE_SERIES", + "coreId": "urn:ard:show:2d0602cd86c69825", + "groupingType": "SHOW", + "homepage": { + "id": null, + "title": "PULS Reportage", + "href": "http://www.br.de/puls/tv/puls/index.html", + "type": null + }, + "hasSeasons": false, + "availableSeasons": null, + "binaryFeatures": [ + "UT" + ], + "isChildContent": false + }, + "subtitled": false, + "titleVisible": true, + "trackingPiano": { + "teaser_content_type": "ondemand", + "teaser_id": "Y3JpZDovL2JyLmRlL3ZpZGVvLzkwZTA1Y2Y5LTA4ZDEtNGU4Zi1iNTQyLWNiYjIyYzcyZDA0Mw", + "teaser_institution": "ARD", + "teaser_institution_id": "urn:ard:institution:453603d77920d274", + "teaser_title": "Reich werden mit KI?!" + }, + "type": "ondemand" + } + ], + "title": "PULS Reportage", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdFNlcmllcy83NWY0MDIwYS04ZjU3LTQ4ZmMtYTVlNS1lZjY3NTY2YjM0MDA", + "widget_title": "PULS Reportage", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_DasErste.json b/src/test/resources/ard/ard_item_STD_DasErste.json new file mode 100644 index 000000000..27c53125e --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_DasErste.json @@ -0,0 +1,541 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "tagesschau 11:10 Uhr, 01.05.2024", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "tagesschau 11:10 Uhr, 01.05.2024", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "tagesschau 11:10 Uhr, 01.05.2024", + "mediaType": "video", + "lra": "Das Erste", + "channel": "Das Erste", + "show": "tagesschau", + "contentTypes": "UT", + "mediaDistributionType": 1, + "contentId": 13364999, + "metadataId": "crid://tagesschau.de/a2ae3a4f-6a55-4fd5-9d9e-d1012c93ba0c_ganzeSendung", + "clipLength": 306 + }, + "chapter2": "Player", + "chapter3": "tagesschau", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/tagesschau/tagesschau 11:10 Uhr, 01.05.2024/13364999/20240501_0910", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:056362c04b1adc91", + "page_content_title": "tagesschau 11:10 Uhr, 01.05.2024", + "page_id": "player_ondemand-page-ard", + "page_institution": "Das Erste", + "page_institution_id": "urn:ard:institution:59ccb6ea77d75af5", + "page_publisher": "Das Erste", + "page_publisher_id": "urn:ard:publisher:a42e4291cd9eaf0b", + "page_show": "tagesschau", + "page_show_id": "urn:ard:show:5b43cccc3d987b41", + "page_title": "tagesschau 11:10 Uhr, 01.05.2024", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2024-05-08T09:23:08.362Z", + "binaryFeatures": [ + "UT" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-05-01T09:10:00Z", + "embeddable": true, + "geoblocked": false, + "id": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw", + "image": { + "alt": "Sendungsbild", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:bbd68d148bf21f20?w={width}&ch=cd3e7e52a4a157d5", + "title": "Sendungsbild" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2024-05-08T09:23:08.362Z", + "broadcastedOnDateTime": "2024-05-01T09:10:00Z", + "clipSourceName": "Das Erste", + "durationSeconds": 306, + "images": [ + { + "alt": "Sendungsbild", + "aspectRatio": "16x9", + "imageSourceName": "ARD-aktuell", + "kind": "preview", + "title": "Sendungsbild", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:bbd68d148bf21f20?w=960&ch=cd3e7e52a4a157d5" + } + ], + "publicationService": { + "id": "ard", + "name": "Das Erste", + "partner": "daserste" + }, + "seriesTitle": "tagesschau", + "synopsis": "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", + "title": "tagesschau 11:10 Uhr, 01.05.2024" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13364999", + "length": "306", + "nol_c0": "p0,0", + "nol_c10": "p10,Das Erste", + "nol_c12": "p12,Content", + "nol_c15": "p15,X005417917", + "nol_c16": "p16,ARD_Information", + "nol_c18": "p18,N", + "nol_c19": "p19,Das Erste", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://tagesschau.de/a2ae3a4f-6a55-4fd5-9d9e-d1012c93ba0c_ganzeSendung", + "nol_c8": "p8,306", + "nol_c9": "p9,tagesschau_tagesschau 11:10 Uhr, 01.05.2024_01.05.2024 09:10", + "program": "tagesschau", + "title": "Das Erste_tagesschau_tagesschau 11:10 Uhr, 01.05.2024_01.05.2024 09:10", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "306", + "mediaLabel": "tagesschau 11:10 Uhr, 01.05.2024__13364999__UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Das Erste", + "mediaTheme2": "Das Erste", + "mediaTheme3": "tagesschau", + "mediaType": "video", + "playerId": "urn:ard:publication:056362c04b1adc91", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "tagesschau 11:10 Uhr, 01.05.2024", + "av_content_duration": 306000, + "av_content_id": "urn:ard:publication:056362c04b1adc91", + "av_content_type": "video", + "av_institution": "Das Erste", + "av_institution_id": "urn:ard:institution:59ccb6ea77d75af5", + "av_publisher": "Das Erste", + "av_publisher_id": "urn:ard:publisher:a42e4291cd9eaf0b", + "av_show": "tagesschau", + "av_show_id": "urn:ard:show:5b43cccc3d987b41" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webl.h264.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webm.h264.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webxxl.h264.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://adaptive.tagesschau.de/i/video/2024/0501/TV-20240501-1117-3700,.webm.h264.mp4,.webxxl.h264.mp4,.webxl.h264.mp4,.webl.h264.mp4,.webs.h264.mp4,.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://media.tagesschau.de/video/2024/0501/TV-20240501-1117-3700.webxl.h264.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:c09c9cee3bf53db8" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:c09c9cee3bf53db8.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "Das Erste", + "logo": { + "title": "Logo Das Erste", + "alt": "Logo Das Erste", + "producerName": "Logo Das Erste", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "das_erste", + "id": "b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ", + "coreId": "urn:ard:publisher:a42e4291cd9eaf0b" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "tagesschau 11:10 Uhr, 01.05.2024", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", + "title": "tagesschau", + "image": { + "alt": "Sendungsbild der tagesschau", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c94583f063e6f8c0?w={width}&ch=4c0812e9bf3625ec", + "title": "Sendungsbild der tagesschau" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "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", + "title": "tagesschau 11:10 Uhr, 01.05.2024", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "tagesschau 11:10 Uhr, 01.05.2024", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 3872 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", + "urlId": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", + "title": "tagesschau", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU?excludedAssetIds=Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvYTJhZTNhNGYtNmE1NS00ZmQ1LTlkOWUtZDEwMTJjOTNiYTBjX2dhbnplU2VuZHVuZw&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [ + { + "availableTo": null, + "binaryFeatures": [ + "UT" + ], + "broadcastedOn": "2024-05-01T18:00:00Z", + "coreAssetType": "EPISODE", + "duration": 954, + "id": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "images": { + "aspect16x9": { + "alt": "Sendungsbild", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:6ce58d3a4a18673c?w={width}&ch=9cff9f17e67f6fa5", + "title": "Sendungsbild" + }, + "aspect16x7": { + "alt": "Sendungsbild", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:ff55a704af948fe8?w={width}&ch=50da2deaaf8d1564", + "title": "Sendungsbild" + }, + "aspect1x1": { + "alt": "Sendungsbild", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:f4843e5441d099aa?w={width}&ch=7531657e1b605e1d", + "title": "Sendungsbild" + } + }, + "isChildContent": false, + "longTitle": "tagesschau 20:00 Uhr, 01.05.2024", + "maturityContentRating": "NONE", + "mediumTitle": "tagesschau 20:00 Uhr, 01.05.2024", + "personalized": false, + "playtime": null, + "publicationService": { + "name": "Das Erste", + "logo": { + "title": "Logo Das Erste", + "alt": "Logo Das Erste", + "producerName": "Logo Das Erste", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "das_erste", + "id": "b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ", + "coreId": "urn:ard:publisher:a42e4291cd9eaf0b" + }, + "links": { + "self": { + "id": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "urlId": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "title": "tagesschau 20:00 Uhr, 01.05.2024", + "href": "https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "type": "application/vnd.ard.teaser+json", + "partner": "ard" + }, + "target": { + "id": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "urlId": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "title": "tagesschau 20:00 Uhr, 01.05.2024", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw?devicetype=pc&embedded=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "shortTitle": "tagesschau 20:00 Uhr, 01.05.2024", + "show": { + "id": "crid://daserste.de/tagesschau", + "coremediaId": 4326, + "title": "tagesschau", + "publisher": { + "name": "Das Erste", + "logo": { + "title": "Logo Das Erste", + "alt": "Logo Das Erste", + "producerName": "Logo Das Erste", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "das_erste", + "id": "b3JnYW5pemF0aW9uX0RhcyBFcnN0ZQ", + "coreId": "urn:ard:publisher:a42e4291cd9eaf0b" + }, + "self": null, + "images": { + "16x9": { + "title": "Sendungsbild der tagesschau", + "alt": "Sendungsbild der tagesschau", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c94583f063e6f8c0?w={width}&ch=4c0812e9bf3625ec", + "aspectRatio": "16x9" + }, + "16x7": { + "title": "Sendungsbild der tagesschau", + "alt": "Sendungsbild der tagesschau", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:5af5a9ce866a1014?w={width}&ch=67ac5c3dcb886ec7", + "aspectRatio": "16x7" + }, + "1x1": { + "title": "Sendungsbild der tagesschau", + "alt": "Sendungsbild der tagesschau", + "producerName": "ARD-aktuell", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:1657a7fbdcd56601?w={width}&ch=7ca5079826fae563", + "aspectRatio": "1x1" + } + }, + "shortSynopsis": "Die Tagesschau ist die älteste und meistgesehene Nachrichtensendung im deutschen Fernsehen. Bis heute der Inbegriff für aktuelle Nachrichten. Seriös und auf den Punkt.", + "synopsis": "Die Tagesschau ist die älteste und meistgesehene Nachrichtensendung im deutschen Fernsehen. Bis heute der Inbegriff für aktuelle Nachrichten. Seriös und auf den Punkt.", + "longSynopsis": "Die Tagesschau ist die älteste und meistgesehene Nachrichtensendung im deutschen Fernsehen. Bis heute der Inbegriff für aktuelle Nachrichten. Seriös und auf den Punkt.", + "modificationDate": null, + "assetSource": null, + "categories": null, + "categoryIds": null, + "coreAssetType": "INFINITE_SERIES", + "coreId": "urn:ard:show:5b43cccc3d987b41", + "groupingType": "SHOW", + "homepage": { + "id": null, + "title": "tagesschau", + "href": "https://www.tagesschau.de", + "type": null + }, + "hasSeasons": false, + "availableSeasons": null, + "binaryFeatures": [ + "UT" + ], + "isChildContent": false + }, + "subtitled": true, + "titleVisible": true, + "trackingPiano": { + "teaser_content_type": "ondemand", + "teaser_id": "Y3JpZDovL3RhZ2Vzc2NoYXUuZGUvNTBjOTc0OGUtMTIwYi00MjllLWI2ODEtZTkyMTY5ODEyNGI0X2dhbnplU2VuZHVuZw", + "teaser_institution": "ARD", + "teaser_institution_id": "urn:ard:institution:453603d77920d274", + "teaser_title": "tagesschau 20:00 Uhr, 01.05.2024" + }, + "type": "ondemand" + } + ], + "title": "tagesschau", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL2Rhc2Vyc3RlLmRlL3RhZ2Vzc2NoYXU", + "widget_title": "tagesschau", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_HR.json b/src/test/resources/ard/ard_item_STD_HR.json new file mode 100644 index 000000000..45aae6091 --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_HR.json @@ -0,0 +1,377 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "hallo hessen – Teil 1 vom 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "hallo hessen – Teil 1 vom 30.04.2024", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "hallo hessen – Teil 1 vom 30.04.2024", + "mediaType": "video", + "lra": "HR", + "channel": "hr-fernsehen", + "show": "hallo hessen", + "contentTypes": "", + "mediaDistributionType": 1, + "contentId": 13363781, + "metadataId": "ebe1419f-59b2-47de-a430-74bde4fb25df", + "clipLength": 2760 + }, + "chapter2": "Player", + "chapter3": "hallo hessen", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/hallo hessen/hallo hessen – Teil 1 vom 30.04.2024/13363781/20240430_1400", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:847ed8d7e13fa5cb", + "page_content_title": "hallo hessen – Teil 1 vom 30.04.2024", + "page_id": "player_ondemand-page-ard", + "page_institution": "HR", + "page_institution_id": "urn:ard:institution:d750cf5d65a50bca", + "page_publisher": "hr-fernsehen", + "page_publisher_id": "urn:ard:publisher:fa9a2b898c8df74c", + "page_show": "hallo hessen", + "page_show_id": "urn:ard:show:4f666cf8cbe1e0c5", + "page_title": "hallo hessen – Teil 1 vom 30.04.2024", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2026-04-30T15:48:03.493Z", + "binaryFeatures": [], + "blockedByFsk": false, + "broadcastedOn": "2024-04-30T14:00:00Z", + "embeddable": true, + "geoblocked": false, + "id": "ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm", + "image": { + "alt": "hallo hessen Moderator Jens Kölker mit den Themen vom 30.04.2024: Wandern auf dem Rheinsteg, Start in die Grillsaison, Erdbeeren aus Hessen", + "producerName": "hr", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:afd6aff4051b922d?w={width}&ch=92aaa8bc924b79db", + "title": "hallo hessen, 30.04.2024" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2026-04-30T15:48:03.493Z", + "broadcastedOnDateTime": "2024-04-30T14:00:00Z", + "clipSourceName": "HR", + "durationSeconds": 2760, + "images": [ + { + "alt": "hallo hessen Moderator Jens Kölker mit den Themen vom 30.04.2024: Wandern auf dem Rheinsteg, Start in die Grillsaison, Erdbeeren aus Hessen", + "aspectRatio": "16x9", + "imageSourceName": "hr", + "kind": "preview", + "title": "hallo hessen, 30.04.2024", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:afd6aff4051b922d?w=960&ch=92aaa8bc924b79db" + } + ], + "publicationService": { + "id": "ard", + "name": "hr-fernsehen", + "partner": "hr" + }, + "seriesTitle": "hallo hessen", + "synopsis": "Der Mai steht vor der Tür und wir haben für Sie die perfekten Wandertipps. Los geht es heute mit dem herrlichen Rheingau. Außerdem wollen wir passend dazu auch die Grillsaison eröffnen. Und ein hessischer Erdbeerbauer verrät uns alles Wissenswerte um die roten Superfrüchtchen.", + "title": "hallo hessen – Teil 1 vom 30.04.2024" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13363781", + "length": "2760", + "nol_c0": "p0,0", + "nol_c10": "p10,hr-fernsehen", + "nol_c12": "p12,Content", + "nol_c15": "p15,A7A4E43294AD41EBBB7EA28A549804FF", + "nol_c16": "p16,hr-fernsehen_Information|Magazin", + "nol_c18": "p18,N", + "nol_c19": "p19,HR", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519", + "nol_c8": "p8,2760", + "nol_c9": "p9,hallo hessen_hallo hessen – Teil 1 vom 30.04.2024_30.04.2024 14:00", + "program": "hallo hessen", + "title": "hr-fernsehen_hallo hessen_hallo hessen – Teil 1 vom 30.04.2024_30.04.2024 14:00", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "2760", + "mediaLabel": "hallo hessen – Teil 1 vom 30.04.2024__13363781__", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Hessischer Rundfunk", + "mediaTheme2": "hr-fernsehen", + "mediaTheme3": "hallo hessen", + "mediaType": "video", + "playerId": "urn:ard:publication:847ed8d7e13fa5cb", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "hallo hessen – Teil 1 vom 30.04.2024", + "av_content_duration": 2760000, + "av_content_id": "urn:ard:publication:847ed8d7e13fa5cb", + "av_content_type": "video", + "av_institution": "HR", + "av_institution_id": "urn:ard:institution:d750cf5d65a50bca", + "av_publisher": "hr-fernsehen", + "av_publisher_id": "urn:ard:publisher:fa9a2b898c8df74c", + "av_show": "hallo hessen", + "av_show_id": "urn:ard:show:4f666cf8cbe1e0c5" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_1280x720-50p-3200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_640x360-50p-1200kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://hrardmediathek-vh.akamaihd.net/i/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_,640x360-50p-1200,1920x1080-50p-5000,1280x720-50p-3200,960x540-50p-1600,kbit.mp4/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_1920x1080-50p-5000kbit.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://hrardmediathek-a.akamaihd.net/odinson/hallo-hessen/SVID-BC6574CF-5A5A-4D00-B8D3-44D241F14519/ebe1419f-59b2-47de-a430-74bde4fb25df/L489595_sendeton_960x540-50p-1600kbit.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "hr-fernsehen", + "logo": { + "title": "Logo hr-fernsehen", + "alt": "Logo hr-fernsehen", + "producerName": "Logo hr-fernsehen", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "hr", + "id": "b3JnYW5pemF0aW9uX0hS", + "coreId": "urn:ard:publisher:fa9a2b898c8df74c" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "hallo hessen – Teil 1 vom 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ", + "title": "hallo hessen", + "image": { + "alt": "Hallo Hessen", + "producerName": "hr", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:2da8a9389da90c00?w={width}&ch=9827a276888c2551", + "title": "hallo-hessen_buehne_16-9" + }, + "availableSeasons": null, + "binaryFeatures": [], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Der Mai steht vor der Tür und wir haben für Sie die perfekten Wandertipps. Los geht es heute mit dem herrlichen Rheingau. Außerdem wollen wir passend dazu auch die Grillsaison eröffnen. Und ein hessischer Erdbeerbauer verrät uns alles Wissenswerte um die roten Superfrüchtchen.", + "title": "hallo hessen – Teil 1 vom 30.04.2024", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "hallo hessen – Teil 1 vom 30.04.2024", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 733 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ", + "urlId": "Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ", + "title": "hallo hessen", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ?excludedAssetIds=ZWJlMTQxOWYtNTliMi00N2RlLWE0MzAtNzRiZGU0ZmIyNWRm&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "hallo hessen", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL2hyLW9ubGluZS8zODIxMDI1MQ", + "widget_title": "hallo hessen", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_NDR.json b/src/test/resources/ard/ard_item_STD_NDR.json new file mode 100644 index 000000000..4eb65c3b6 --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_NDR.json @@ -0,0 +1,398 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "NDR Info 14:00 | 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "NDR Info 14:00 | 30.04.2024", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "NDR Info 14:00 | 30.04.2024", + "mediaType": "video", + "lra": "NDR", + "channel": "NDR", + "show": "NDR Info", + "contentTypes": "UT", + "mediaDistributionType": 1, + "contentId": 13363035, + "metadataId": "crid://ndr.de/proplan_196349710_ganzeSendung", + "clipLength": 619 + }, + "chapter2": "Player", + "chapter3": "NDR Info", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/NDR Info/NDR Info 14:00 | 30.04.2024/13363035/20240430_1200", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:669d9a286a211a00", + "page_content_title": "NDR Info 14:00 | 30.04.2024", + "page_id": "player_ondemand-page-ard", + "page_institution": "NDR", + "page_institution_id": "urn:ard:institution:ea3329bc2aae0d7d", + "page_publisher": "NDR", + "page_publisher_id": "urn:ard:publisher:59786080a6371d6a", + "page_show": "NDR Info", + "page_show_id": "urn:ard:show:acd87abfba49e283", + "page_title": "NDR Info 14:00 | 30.04.2024", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2026-04-30T12:00:00Z", + "binaryFeatures": [ + "UT" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-04-30T12:00:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc", + "image": { + "alt": "Bibiana Barth.", + "producerName": "Screenshot", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:e559feabb978c663?w={width}&ch=3b5bee994192b6ff", + "title": "NDR Info 14:00 | 30.04.2024" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2026-04-30T12:00:00Z", + "broadcastedOnDateTime": "2024-04-30T12:00:00Z", + "clipSourceName": "NDR", + "durationSeconds": 619, + "images": [ + { + "alt": "Bibiana Barth.", + "aspectRatio": "16x9", + "imageSourceName": "Screenshot", + "kind": "preview", + "title": "NDR Info 14:00 | 30.04.2024", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:e559feabb978c663?w=960&ch=3b5bee994192b6ff" + } + ], + "publicationService": { + "id": "ard", + "name": "NDR", + "partner": "ndr" + }, + "seriesTitle": "NDR Info", + "synopsis": "Die Nachrichten für den Norden: Suche nach Arian eingestellt / Viele Pflege-Ausbildungsplätze in Schleswig-Holstein unbesetzt", + "title": "NDR Info 14:00 | 30.04.2024" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13363035", + "length": "619", + "nol_c0": "p0,0", + "nol_c10": "p10,NDR", + "nol_c12": "p12,Content", + "nol_c15": "p15,196349710_14900769", + "nol_c16": "p16,ARD_Information", + "nol_c18": "p18,N", + "nol_c19": "p19,NDR", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://ndr.de/proplan_196349710_ganzeSendung", + "nol_c8": "p8,619", + "nol_c9": "p9,NDR Info_NDR Info 14:00 | 30.04.2024_30.04.2024 12:00", + "program": "NDR Info", + "title": "NDR_NDR Info_NDR Info 14:00 | 30.04.2024_30.04.2024 12:00", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "619", + "mediaLabel": "NDR Info 14:00 | 30.04.2024__13363035__UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Norddeutscher Rundfunk", + "mediaTheme2": "NDR", + "mediaTheme3": "NDR Info", + "mediaType": "video", + "playerId": "urn:ard:publication:669d9a286a211a00", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "NDR Info 14:00 | 30.04.2024", + "av_content_duration": 619000, + "av_content_id": "urn:ard:publication:669d9a286a211a00", + "av_content_type": "video", + "av_institution": "NDR", + "av_institution_id": "urn:ard:institution:ea3329bc2aae0d7d", + "av_publisher": "NDR", + "av_publisher_id": "urn:ard:publisher:59786080a6371d6a", + "av_show": "NDR Info", + "av_show_id": "urn:ard:show:acd87abfba49e283" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://adaptive.ndr.de/i/ndr/2024/0430/TV-20240430-1400-3611.,hq,1080,hd,ln,mn,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.hd.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.hq.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.1080.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://mediandr-a.akamaihd.net/progressive/2024/0430/TV-20240430-1400-3611.ln.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:ea9ad6b71df1b8ed" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:ea9ad6b71df1b8ed.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "NDR", + "logo": { + "title": "Logo NDR", + "alt": "Logo NDR", + "producerName": "Logo NDR", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "ndr", + "id": "b3JnYW5pemF0aW9uX05EUg", + "coreId": "urn:ard:publisher:59786080a6371d6a" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "NDR Info 14:00 | 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL25kci5kZS80NTIz", + "title": "NDR Info", + "image": { + "alt": "NDR Info", + "producerName": "NDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:c5ade5e39dcef4fc?w={width}&ch=f5bd9e239161cda9", + "title": "NDR Info" + }, + "availableSeasons": null, + "binaryFeatures": [ + "UT", + "DGS", + "AD" + ], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Die Nachrichten für den Norden: Suche nach Arian eingestellt / Viele Pflege-Ausbildungsplätze in Schleswig-Holstein unbesetzt", + "title": "NDR Info 14:00 | 30.04.2024", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "NDR Info 14:00 | 30.04.2024", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL25kci5kZS80NTIz", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 7274 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL25kci5kZS80NTIz", + "urlId": "Y3JpZDovL25kci5kZS80NTIz", + "title": "NDR Info", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL25kci5kZS80NTIz?excludedAssetIds=Y3JpZDovL25kci5kZS9wcm9wbGFuXzE5NjM0OTcxMF9nYW56ZVNlbmR1bmc&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "NDR Info", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL25kci5kZS80NTIz", + "widget_title": "NDR Info", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_ONE.json b/src/test/resources/ard/ard_item_STD_ONE.json new file mode 100644 index 000000000..ed926c4da --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_ONE.json @@ -0,0 +1,405 @@ +{ + "coreAssetType": "EXTRA_BONUS_CONTENT", + "fskRating": "FSK12", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "mediaType": "video", + "lra": "ONE", + "channel": "ONE", + "show": "Murdoch Mysteries", + "contentTypes": "UT", + "mediaDistributionType": 1, + "contentId": 13334379, + "metadataId": "crid://wdr.de/Beitrag-sophora-5749411e-dc16-48bd-ad79-fa2fec72de54", + "clipLength": 2764 + }, + "chapter2": "Player", + "chapter3": "Murdoch Mysteries", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Murdoch Mysteries/Folge 4: Geisterstunde (S01/E04) - (Originalversion)/13334379/20240501_0215", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:b1e2c718684c9a80", + "page_content_title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "page_id": "player_ondemand-page-ard", + "page_institution": "ONE", + "page_institution_id": "urn:ard:institution:9edd94d68de90140", + "page_publisher": "ONE", + "page_publisher_id": "urn:ard:publisher:892e3c758ca56a9d", + "page_show": "Murdoch Mysteries", + "page_show_id": "urn:ard:show:85088a146d3740b7", + "page_title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2024-05-08T02:15:00Z", + "binaryFeatures": [ + "OV", + "UT" + ], + "blockedByFsk": false, + "broadcastedOn": "2024-05-01T02:15:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0", + "image": { + "alt": "Dr. Ogden (Hélène Joy) untersucht die Leiche von Amos, während Detective Murdoch (Yannick Bisson) zusieht.", + "producerName": "WDR", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:13faad6cef810a2a?w={width}&ch=d7cb07e74d3b8ecc", + "title": "Murdoch Mysteries (S01/E04) - OV" + }, + "isChildContent": false, + "maturityContentRating": "FSK12", + "mediaCollection": { + "embedded": { + "isGeoBlocked": true, + "meta": { + "availableToDateTime": "2024-05-08T02:15:00Z", + "broadcastedOnDateTime": "2024-05-01T02:15:00Z", + "clipSourceName": "ONE", + "durationSeconds": 2764, + "images": [ + { + "alt": "Dr. Ogden (Hélène Joy) untersucht die Leiche von Amos, während Detective Murdoch (Yannick Bisson) zusieht.", + "aspectRatio": "16x9", + "imageSourceName": "WDR", + "kind": "preview", + "title": "Murdoch Mysteries (S01/E04) - OV", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:13faad6cef810a2a?w=960&ch=d7cb07e74d3b8ecc" + } + ], + "maturityContentRating": { + "age": 12, + "isBlocked": false, + "kind": "other" + }, + "publicationService": { + "id": "ard", + "name": "ONE", + "partner": "one" + }, + "synopsis": "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. ", + "title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13334379", + "length": "2764", + "nol_c0": "p0,0", + "nol_c10": "p10,ONE", + "nol_c12": "p12,Content", + "nol_c15": "p15,POC_2002800613", + "nol_c16": "p16,Fiction", + "nol_c18": "p18,N", + "nol_c19": "p19,ONE", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,crid://wdr.de/Beitrag-sophora-5749411e-dc16-48bd-ad79-fa2fec72de54", + "nol_c8": "p8,2764", + "nol_c9": "p9,Murdoch Mysteries_Folge 4: Geisterstunde (S01/E04) - (Originalversion)_01.05.2024 02:15", + "program": "Murdoch Mysteries", + "title": "ONE_Murdoch Mysteries_Folge 4: Geisterstunde (S01/E04) - (Originalversion)_01.05.2024 02:15", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "2764", + "mediaLabel": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)__13334379__OV | UT", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "ONE", + "mediaTheme2": "ONE", + "mediaTheme3": "Murdoch Mysteries", + "mediaType": "video", + "playerId": "urn:ard:publication:b1e2c718684c9a80", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "av_content_duration": 2764000, + "av_content_id": "urn:ard:publication:b1e2c718684c9a80", + "av_content_type": "video", + "av_institution": "ONE", + "av_institution_id": "urn:ard:institution:9edd94d68de90140", + "av_publisher": "ONE", + "av_publisher_id": "urn:ard:publisher:892e3c758ca56a9d", + "av_show": "Murdoch Mysteries", + "av_show_id": "urn:ard:show:85088a146d3740b7" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "ov" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://wdradaptiv-vh.akamaihd.net/i/medp/ondemand/de/fsk12/310/3106351/,3106351_57089636,3106351_57089637,3106351_57089635,3106351_57089638,3106351_57089634,.mp4.csmil/master.m3u8", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "ov" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089636.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "ov" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089637.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "ov" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089634.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "ov" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk12/310/3106351/3106351_57089638.mp4", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [ + { + "kind": "normal", + "languageCode": "deu", + "sources": [ + { + "kind": "ebutt", + "url": "https://api.ardmediathek.de/player-service/subtitle/ebutt/urn:ard:subtitle:0567b031db73e4b9" + }, + { + "kind": "webvtt", + "url": "https://api.ardmediathek.de/player-service/subtitle/webvtt/urn:ard:subtitle:0567b031db73e4b9.vtt" + } + ] + } + ] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "ONE", + "logo": { + "title": "Logo ONE", + "alt": "Logo ONE", + "producerName": "Logo ONE", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "one", + "id": "b3JnYW5pemF0aW9uX09ORQ", + "coreId": "urn:ard:publisher:892e3c758ca56a9d" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw", + "title": "Murdoch Mysteries", + "image": { + "alt": "Sendungslogo \"Murdoch Mysteries\"", + "producerName": "Shaftesbury Murdoch II Inc", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:559937f982bde0f5?w={width}&ch=dc9ee6ab714f2b88", + "title": "Murdoch Mysteries" + }, + "availableSeasons": [ + "1", + "4" + ], + "binaryFeatures": [ + "UT", + "OV" + ], + "coreAssetType": "SEASON_SERIES" + }, + "synopsis": "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. ", + "title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Folge 4: Geisterstunde (S01/E04) - (Originalversion)", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 15 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw", + "urlId": "Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw", + "title": "Murdoch Mysteries", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw?excludedAssetIds=Y3JpZDovL3dkci5kZS9CZWl0cmFnLXNvcGhvcmEtNTc0OTQxMWUtZGMxNi00OGJkLWFkNzktZmEyZmVjNzJkZTU0&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Murdoch Mysteries", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL3dkci5kZTdvbmUvbXVyZG9jaG15c3Rlcmllcw", + "widget_title": "Murdoch Mysteries", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_STD_RBB.json b/src/test/resources/ard/ard_item_STD_RBB.json new file mode 100644 index 000000000..f8505df2b --- /dev/null +++ b/src/test/resources/ard/ard_item_STD_RBB.json @@ -0,0 +1,377 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Blue Moon vom 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Blue Moon vom 30.04.2024", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Blue Moon vom 30.04.2024", + "mediaType": "video", + "lra": "RBB", + "channel": "rbb Fernsehen", + "show": "Blue Moon", + "contentTypes": "", + "mediaDistributionType": 1, + "contentId": 13364935, + "metadataId": "crid://rbb_3d54fca4-9a7d-452d-b659-c5df19532ba0_publication", + "clipLength": 6195 + }, + "chapter2": "Player", + "chapter3": "Blue Moon", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Blue Moon/Blue Moon vom 30.04.2024/13364935/20240430_2015", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:13a17ee4a534c2b4", + "page_content_title": "Blue Moon vom 30.04.2024", + "page_id": "player_ondemand-page-ard", + "page_institution": "RBB", + "page_institution_id": "urn:ard:institution:6fd2ea6b797a605b", + "page_publisher": "rbb Fernsehen", + "page_publisher_id": "urn:ard:publisher:4bd261083522aeef", + "page_show": "Blue Moon", + "page_show_id": "urn:ard:show:27233a9f3d191182", + "page_title": "Blue Moon vom 30.04.2024", + "site": "634408" + }, + "widgets": [ + { + "availableTo": "2026-04-30T21:59:59Z", + "binaryFeatures": [], + "blockedByFsk": false, + "broadcastedOn": "2024-04-30T20:15:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24", + "image": { + "alt": "Moderatorin Claudia Kamieth (Quelle: rbb/Lilly Extra/Holger Günther)", + "producerName": "rbb/Lilly Extra/Holger Günther", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:d7bfa9a891a19695?w={width}&ch=c38a8fa44f1ec834", + "title": "Blue Moon, Moderatorin Claudia Kamieth" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "availableToDateTime": "2026-04-30T21:59:59Z", + "broadcastedOnDateTime": "2024-04-30T20:15:00Z", + "clipSourceName": "rbb", + "durationSeconds": 6195, + "images": [ + { + "alt": "Moderatorin Claudia Kamieth (Quelle: rbb/Lilly Extra/Holger Günther)", + "aspectRatio": "16x9", + "imageSourceName": "rbb/Lilly Extra/Holger Günther", + "kind": "preview", + "title": "Blue Moon, Moderatorin Claudia Kamieth", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:b02c96000d82e941?w=960&ch=ade4b9c4aa512941" + } + ], + "publicationService": { + "id": "ard", + "name": "rbb Fernsehen", + "partner": "rbb" + }, + "seriesTitle": "Blue Moon", + "synopsis": "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: Wurdet ihr mal gemobbt und wie sehr hat euch das geprägt? Habt ihr beobachtet, wie Kolleg:innen vom Boss gemobbt wurden oder habt ihr selbst jemanden gemobbt und bereut es heute? Ruft an unter 0331 70 97 110 und erzählt eure Geschichte! Heute gibt's den Blue Moon wieder zum Hören bei YOUFM und Fritz und auch zum Sehen im rbb Fernsehen.", + "title": "Blue Moon vom 30.04.2024" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "13364935", + "length": "6195", + "nol_c0": "p0,0", + "nol_c10": "p10,rbb Fernsehen", + "nol_c12": "p12,Content", + "nol_c15": "p15,", + "nol_c16": "p16,", + "nol_c18": "p18,N", + "nol_c19": "p19,rbb", + "nol_c2": "p2,N", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,rbb_3d54fca4-9a7d-452d-b659-c5df19532ba0", + "nol_c8": "p8,6195", + "nol_c9": "p9,Blue Moon_Blue Moon vom 30.04.2024_30.04.2024 20:15", + "program": "Blue Moon", + "title": "rbb Fernsehen_Blue Moon_Blue Moon vom 30.04.2024_30.04.2024 20:15", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "6195", + "mediaLabel": "Blue Moon vom 30.04.2024__13364935__", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "Rundfunk Berlin-Brandenburg", + "mediaTheme2": "rbb Fernsehen", + "mediaTheme3": "Blue Moon", + "mediaType": "video", + "playerId": "urn:ard:publication:13a17ee4a534c2b4", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Blue Moon vom 30.04.2024", + "av_content_duration": 6195000, + "av_content_id": "urn:ard:publication:13a17ee4a534c2b4", + "av_content_type": "video", + "av_institution": "RBB", + "av_institution_id": "urn:ard:institution:6fd2ea6b797a605b", + "av_publisher": "rbb Fernsehen", + "av_publisher_id": "urn:ard:publisher:4bd261083522aeef", + "av_show": "Blue Moon", + "av_show_id": "urn:ard:show:27233a9f3d191182" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Full HD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc1080.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "HD Ready", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1280, + "maxVResolutionPx": 720, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc720.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 640, + "maxVResolutionPx": 360, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc360.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "SD 480p", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 960, + "maxVResolutionPx": 540, + "mimeType": "video/mp4", + "subtitles": [], + "url": "https://rbbmediapmdp-a.akamaihd.net/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_hd1080-avc540.mp4", + "videoCodec": "H.264" + }, + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": false, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "https://rbbvod.akamaized.net/i/content/dd/f9/ddf9c4f0-2da1-45b9-812f-873f213ccbd5/eb2ed184-078d-11ef-b0da-02420a000df3_,hd1080-avc360,hd1080-avc270,hd1080-avc540,hd1080-avc720,hd1080-avc1080,.mp4.csmil/master.m3u8?set-akamai-hls-revision=5", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "rbb Fernsehen", + "logo": { + "title": "Logo rbb Fernsehen", + "alt": "Logo rbb Fernsehen", + "producerName": "Logo rbb Fernsehen", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "rbb", + "id": "b3JnYW5pemF0aW9uX1JCQg", + "coreId": "urn:ard:publisher:4bd261083522aeef" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Blue Moon vom 30.04.2024", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u", + "title": "Blue Moon", + "image": { + "alt": "Logo: Blue Moon (Quelle: rbb/Lilly Extra/Holger Günther)", + "producerName": "rbb/Lilly Extra/Holger Günther", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:b9822f72da75ccf1?w={width}&ch=013476f5a68eff0c", + "title": "Logo: Blue Moon" + }, + "availableSeasons": null, + "binaryFeatures": [], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "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: Wurdet ihr mal gemobbt und wie sehr hat euch das geprägt? Habt ihr beobachtet, wie Kolleg:innen vom Boss gemobbt wurden oder habt ihr selbst jemanden gemobbt und bereut es heute? Ruft an unter 0331 70 97 110 und erzählt eure Geschichte! Heute gibt's den Blue Moon wieder zum Hören bei YOUFM und Fritz und auch zum Sehen im rbb Fernsehen.", + "title": "Blue Moon vom 30.04.2024", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Blue Moon vom 30.04.2024", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 11 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u", + "urlId": "Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u", + "title": "Blue Moon", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u?excludedAssetIds=Y3JpZDovL3JiYl8zZDU0ZmNhNC05YTdkLTQ1MmQtYjY1OS1jNWRmMTk1MzJiYTBfcHVibGljYXRpb24&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [], + "title": "Blue Moon", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL3JiYi1vbmxpbmUuZGUvYmx1ZS1tb29u", + "widget_title": "Blue Moon", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_fallback.json b/src/test/resources/ard/ard_item_fallback.json new file mode 100644 index 000000000..1234d912b --- /dev/null +++ b/src/test/resources/ard/ard_item_fallback.json @@ -0,0 +1,429 @@ +{ + "coreAssetType": "EPISODE", + "fskRating": "NONE", + "id": "player_ondemand-page-ard", + "isChildContent": false, + "personalized": false, + "links": { + "self": { + "id": "player_ondemand-page-ard", + "urlId": "player_ondemand-page-ard", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE?embedded=true&mcV6=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "tracking": { + "aggregationLevelId": 38, + "atiCustomVars": { + "clipTitle": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "mediaType": "video", + "lra": "funk", + "channel": "funk", + "show": "Fickt euch!", + "contentTypes": "", + "mediaDistributionType": 1, + "contentId": 83859168, + "metadataId": "crid://funk.net/835/video/106381", + "clipLength": 185 + }, + "chapter2": "Player", + "chapter3": "Fickt euch!", + "environmentId": 511893, + "pageTitle": "Mediathek/Player/Fickt euch!/Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex/83859168/20161213_1400", + "szmType": "CP" + }, + "trackingPiano": { + "page_chapter1": "Player", + "page_content_id": "urn:ard:publication:0500c9bbe1a10738", + "page_content_title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "page_id": "player_ondemand-page-ard", + "page_institution": "funk", + "page_institution_id": "urn:ard:institution:3aa504dd9fc1e250", + "page_publisher": "funk", + "page_publisher_id": "urn:ard:publisher:bed7b6abe4dbfaca", + "page_show": "Fickt euch!", + "page_show_id": "urn:ard:show:ac739b52556da95d", + "page_title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "site": "634408" + }, + "widgets": [ + { + "availableTo": null, + "binaryFeatures": [], + "blockedByFsk": false, + "broadcastedOn": "2016-12-13T14:00:00Z", + "embeddable": false, + "geoblocked": false, + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE", + "image": { + "alt": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex - Thumbnail", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a62bc714b8d0978e?w={width}&ch=06c37142f9990c3e", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex - Thumbnail" + }, + "isChildContent": false, + "maturityContentRating": "NONE", + "mediaCollection": { + "embedded": { + "isGeoBlocked": false, + "meta": { + "broadcastedOnDateTime": "2016-12-13T14:00:00Z", + "clipSourceName": "funk", + "durationSeconds": 185, + "images": [ + { + "alt": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex - Thumbnail", + "aspectRatio": "16x9", + "imageSourceName": "funk", + "kind": "preview", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex - Thumbnail", + "url": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a62bc714b8d0978e?w=960&ch=06c37142f9990c3e" + } + ], + "publicationService": { + "id": "ard", + "name": "funk", + "partner": "funk" + }, + "seriesTitle": "Fickt euch!", + "synopsis": "Den Penis richtig waschen ist ganz\neinfach! Was ihr beachten müsst, um Infektionen und unangenehme Gerüche zu vermeiden, erfahrt\nihr im Video.\nDu willst mehr? Dann abonniere meinen\nKanal: https://www.youtube.com/channel/UC3ZkjIfabQzVypsQBd9-AIQ?sub_confirmation=1Fickt euch! bei\nFacebook: http://www.facebook.com/istdochnursexFickt euch! bei\nInstagram: http://www.instagram.com/istdochnursexFickt euch! bei\nSnapchat: @istdochnursex", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex" + }, + "pluginData": { + "recommendation@all": { + "isAutoplay": true, + "timerSeconds": 10, + "url": "https://api.ardmediathek.de/page-gateway/compilations/ard/recommendations?contextItemId=Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE" + }, + "trackingAgf@all": { + "appId": "PA02DC09C-B8D3-4098-87D2-2C023682D6D5", + "clipData": { + "assetid": "83859168", + "length": "185", + "nol_c0": "p0,0", + "nol_c10": "p10,funk", + "nol_c12": "p12,Content", + "nol_c15": "p15,", + "nol_c16": "p16,", + "nol_c18": "p18,N", + "nol_c19": "p19,funk", + "nol_c2": "p2,Y", + "nol_c5": "p5,ARD Mediathek", + "nol_c7": "p7,funk/episode/video/106381", + "nol_c8": "p8,185", + "nol_c9": "p9,Fickt euch!_Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex_13.12.2016 14:00", + "program": "Fickt euch!", + "title": "funk_Fickt euch!_Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex_13.12.2016 14:00", + "type": "content" + }, + "tracker": "AGF" + }, + "trackingAti@all": { + "config": { + "site": 511893 + }, + "isEnabled": true, + "richMedia": { + "broadcastMode": "clip", + "duration": "185", + "mediaLabel": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex__83859168__", + "mediaLevel2": "{richMediaLevelTwo}", + "mediaTheme1": "funk", + "mediaTheme2": "funk", + "mediaTheme3": "Fickt euch!", + "mediaType": "video", + "playerId": "urn:ard:publication:0500c9bbe1a10738", + "refreshDuration": { + "0": 5, + "1": 12, + "12": 15, + "18": 30 + } + }, + "tracker": "ATI" + }, + "trackingPiano@all": { + "avContent": { + "av_broadcasting_type": "OnDemand", + "av_content": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "av_content_duration": 185000, + "av_content_id": "urn:ard:publication:0500c9bbe1a10738", + "av_content_type": "video", + "av_institution": "funk", + "av_institution_id": "urn:ard:institution:3aa504dd9fc1e250", + "av_publisher": "funk", + "av_publisher_id": "urn:ard:publisher:bed7b6abe4dbfaca", + "av_show": "Fickt euch!", + "av_show_id": "urn:ard:show:ac739b52556da95d" + }, + "config": { + "events": [ + "av.error", + "av.speed", + "av.quality", + "av.jumpmark", + "av.share", + "av.playermode", + "av.subtitle", + "av.language", + "av.audiodescription", + "av.signlanguage", + "av.volume.mute", + "av.recommendation" + ], + "site": 634408 + }, + "isEnabled": true + } + }, + "streams": [ + { + "kind": "main", + "kindName": "Normal", + "media": [ + { + "aspectRatio": "16:9", + "audios": [ + { + "kind": "standard", + "languageCode": "deu" + } + ], + "forcedLabel": "Auto", + "hasEmbeddedSubtitles": false, + "isAdaptiveQualitySelectable": true, + "isHighDynamicRange": false, + "maxHResolutionPx": 1920, + "maxVResolutionPx": 1080, + "mimeType": "application/vnd.apple.mpegurl", + "subtitles": [], + "url": "http://localhost:0000/22679/files/21/01/30/2678992/22679-jqh9gFKRm8YDnC2.ism/manifest.m3u8", + "videoCodec": "H.264" + } + ], + "videoLanguageCode": "" + } + ], + "subtitles": [] + }, + "href": "https://api.ardmediathek.de/page-gateway/mediacollectionv6/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE?isTv=false" + }, + "pagination": null, + "personalized": false, + "playerConfig": null, + "publicationService": { + "name": "funk", + "logo": { + "title": "Logo funk", + "alt": "Logo funk", + "producerName": "Logo funk", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "funk", + "id": "b3JnYW5pemF0aW9uX2Z1bms", + "coreId": "urn:ard:publisher:bed7b6abe4dbfaca" + }, + "links": { + "self": { + "id": "player_on_demand_widget_ard", + "urlId": "player_on_demand_widget_ard", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/player_on_demand_widget_ard/item/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE?pageNumber=0&pageSize=100&embedded=true&mcV6=true", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "show": { + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNQ", + "title": "Fickt euch!", + "image": { + "alt": "Fickt euch! - Teaser", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:5b473fcf58f57696?w={width}&ch=8510844b07cbdef9", + "title": "Fickt euch! - Teaser" + }, + "availableSeasons": null, + "binaryFeatures": [], + "coreAssetType": "INFINITE_SERIES" + }, + "synopsis": "Den Penis richtig waschen ist ganz\neinfach! Was ihr beachten müsst, um Infektionen und unangenehme Gerüche zu vermeiden, erfahrt\nihr im Video.\nDu willst mehr? Dann abonniere meinen\nKanal: https://www.youtube.com/channel/UC3ZkjIfabQzVypsQBd9-AIQ?sub_confirmation=1Fickt euch! bei\nFacebook: http://www.facebook.com/istdochnursexFickt euch! bei\nInstagram: http://www.instagram.com/istdochnursexFickt euch! bei\nSnapchat: @istdochnursex", + "title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "player_on_demand_widget_ard", + "widget_title": "Keine Chance für Smegma! Intimhygiene für Jungs I Fickt euch - Ist doch nur Sex", + "widget_typ": "player_ondemand" + }, + "type": "player_ondemand" + }, + { + "aZContent": false, + "compilationType": "itemsOfShow", + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNQ", + "isChildContent": false, + "pagination": { + "pageNumber": 0, + "pageSize": 24, + "totalElements": 123 + }, + "personalized": false, + "links": { + "self": { + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNQ", + "urlId": "Y3JpZDovL2Z1bmsubmV0LzgzNQ", + "title": "Fickt euch!", + "href": "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL2Z1bmsubmV0LzgzNQ?excludedAssetIds=Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMDYzODE&pageNumber=0&pageSize=24&embedded=true&seasoned=false&seasonNumber=&withAudiodescription=false&withOriginalWithSubtitle=false&withOriginalversion=false&single=false", + "type": "application/vnd.ard.widget+json", + "partner": "ard" + } + }, + "size": "m", + "swipeable": true, + "teasers": [ + { + "availableTo": null, + "binaryFeatures": [], + "broadcastedOn": "2017-12-19T14:00:00Z", + "coreAssetType": "EPISODE", + "duration": 37, + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "images": { + "aspect16x9": { + "alt": "Tschüss! | Fickt euch – Ist doch nur Sex - Thumbnail", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:149bea358a4674e1?w={width}&ch=40739cec4e752349", + "title": "Tschüss! | Fickt euch – Ist doch nur Sex - Thumbnail" + } + }, + "isChildContent": false, + "longTitle": "Tschüss! | Fickt euch – Ist doch nur Sex", + "maturityContentRating": "NONE", + "mediumTitle": "Tschüss! | Fickt euch – Ist doch nur Sex", + "personalized": false, + "playtime": null, + "publicationService": { + "name": "funk", + "logo": { + "title": "Logo funk", + "alt": "Logo funk", + "producerName": "Logo funk", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "funk", + "id": "b3JnYW5pemF0aW9uX2Z1bms", + "coreId": "urn:ard:publisher:bed7b6abe4dbfaca" + }, + "links": { + "self": { + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "urlId": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "title": "Tschüss! | Fickt euch – Ist doch nur Sex", + "href": "https://api.ardmediathek.de/page-gateway/teasers/ard/items/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "type": "application/vnd.ard.teaser+json", + "partner": "ard" + }, + "target": { + "id": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "urlId": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "title": "Tschüss! | Fickt euch – Ist doch nur Sex", + "href": "https://api.ardmediathek.de/page-gateway/pages/ard/item/Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4?devicetype=pc&embedded=true", + "type": "application/vnd.ard.page+json", + "partner": "ard" + } + }, + "shortTitle": "Tschüss! | Fickt euch – Ist doch nur Sex", + "show": { + "id": "crid://funk.net/835", + "coremediaId": 83853182, + "title": "Fickt euch!", + "publisher": { + "name": "funk", + "logo": { + "title": "Logo funk", + "alt": "Logo funk", + "producerName": "Logo funk", + "src": "https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio": "16x9" + }, + "publisherType": "TV", + "partner": "funk", + "id": "b3JnYW5pemF0aW9uX2Z1bms", + "coreId": "urn:ard:publisher:bed7b6abe4dbfaca" + }, + "self": null, + "images": { + "16x9": { + "title": "Fickt euch! - Teaser", + "alt": "Fickt euch! - Teaser", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:5b473fcf58f57696?w={width}&ch=8510844b07cbdef9", + "aspectRatio": "16x9" + }, + "16x7": { + "title": "Fickt euch! - Teaser", + "alt": "Fickt euch! - Teaser", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:672d8047665fffa0?w={width}&ch=6ed45b3de1ca3f3b", + "aspectRatio": "16x7" + }, + "1x1": { + "title": "Fickt euch! - Profile", + "alt": "Fickt euch! - Profile", + "producerName": "funk", + "src": "https://api.ardmediathek.de/image-service/images/urn:ard:image:a1f8855921b72c36?w={width}&ch=d473294baabf1237", + "aspectRatio": "1x1" + } + }, + "shortSynopsis": "»Fickt euch!« beantwortet alle Fragen zum Thema Sex - offen und tabulos. Einmal die Woche erzählt Kristina auf YouTube, wie vielfältig Sex sein kann, spricht Themen an, die man vielleicht nicht mit Freunden und Familie besprechen möchte und geht auf die Fragen ihrer Nutzer ein. »Fuck.TEN« fasst die zehn wichtigsten Fakten aus »Fickt euch!« zusammen. Kristina Weitkamp hat mit dem YouTube-Kanal »DAFUQ Love & Sex« bereits zwei Jahre lang in Sachen Liebesfragen viel Erfahrung gesammelt. Jetzt gibt sie ihr Wissen weiter.", + "synopsis": "»Fickt euch!« beantwortet alle Fragen zum Thema Sex - offen und tabulos. Einmal die Woche erzählt Kristina auf YouTube, wie vielfältig Sex sein kann, spricht Themen an, die man vielleicht nicht mit Freunden und Familie besprechen möchte und geht auf die Fragen ihrer Nutzer ein. »Fuck.TEN« fasst die zehn wichtigsten Fakten aus »Fickt euch!« zusammen. Kristina Weitkamp hat mit dem YouTube-Kanal »DAFUQ Love & Sex« bereits zwei Jahre lang in Sachen Liebesfragen viel Erfahrung gesammelt. Jetzt gibt sie ihr Wissen weiter.", + "longSynopsis": "»Fickt euch!« beantwortet alle Fragen zum Thema Sex - offen und tabulos. Einmal die Woche erzählt Kristina auf YouTube, wie vielfältig Sex sein kann, spricht Themen an, die man vielleicht nicht mit Freunden und Familie besprechen möchte und geht auf die Fragen ihrer Nutzer ein. »Fuck.TEN« fasst die zehn wichtigsten Fakten aus »Fickt euch!« zusammen. Kristina Weitkamp hat mit dem YouTube-Kanal »DAFUQ Love & Sex« bereits zwei Jahre lang in Sachen Liebesfragen viel Erfahrung gesammelt. Jetzt gibt sie ihr Wissen weiter.", + "modificationDate": null, + "assetSource": null, + "categories": null, + "categoryIds": null, + "coreAssetType": "INFINITE_SERIES", + "coreId": "urn:ard:show:ac739b52556da95d", + "groupingType": "SHOW", + "homepage": { + "id": null, + "title": "Fickt euch!", + "href": "https://www.funk.net/channel/fickt-euch-835", + "type": null + }, + "hasSeasons": false, + "availableSeasons": null, + "binaryFeatures": [], + "isChildContent": false + }, + "subtitled": false, + "titleVisible": true, + "trackingPiano": { + "teaser_content_type": "ondemand", + "teaser_id": "Y3JpZDovL2Z1bmsubmV0LzgzNS92aWRlby8xMTQzMzY4", + "teaser_institution": "ARD", + "teaser_institution_id": "urn:ard:institution:453603d77920d274", + "teaser_title": "Tschüss! | Fickt euch – Ist doch nur Sex" + }, + "type": "ondemand" + } + ], + "title": "Fickt euch!", + "titleVisible": true, + "trackingPiano": { + "teaser_recommended": false, + "widget_id": "Y3JpZDovL2Z1bmsubmV0LzgzNQ", + "widget_title": "Fickt euch!", + "widget_typ": "gridlist" + }, + "type": "gridlist", + "userVisibility": "ALWAYS" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_item_fallback_m3u.txt b/src/test/resources/ard/ard_item_fallback_m3u.txt new file mode 100644 index 000000000..92229e35b --- /dev/null +++ b/src/test/resources/ard/ard_item_fallback_m3u.txt @@ -0,0 +1,33 @@ +#EXTM3U +#EXT-X-VERSION:4 +## Created with Unified Streaming Platform (version=1.12.8-28913) + +# AUDIO groups +#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-aacl-128",NAME="audio",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="2" +#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-aacl-152",NAME="audio",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="2" + +# variants +#EXT-X-STREAM-INF:BANDWIDTH=483000,CODECS="mp4a.40.2,avc1.4D401F",RESOLUTION=426x240,AUDIO="audio-aacl-128",CLOSED-CAPTIONS=NONE +22679-jqh9gFKRm8YDnC2-audio=128019-video=327000.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=979000,CODECS="mp4a.40.2,avc1.4D401F",RESOLUTION=640x360,AUDIO="audio-aacl-152",CLOSED-CAPTIONS=NONE +22679-jqh9gFKRm8YDnC2-audio=152016-video=771000.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=1735000,CODECS="mp4a.40.2,avc1.4D401F",RESOLUTION=1024x576,AUDIO="audio-aacl-152",CLOSED-CAPTIONS=NONE +22679-jqh9gFKRm8YDnC2-audio=152016-video=1484000.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=3162000,CODECS="mp4a.40.2,avc1.4D401F",RESOLUTION=1280x720,AUDIO="audio-aacl-152",CLOSED-CAPTIONS=NONE +22679-jqh9gFKRm8YDnC2-audio=152016-video=2831000.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=4278000,CODECS="mp4a.40.2,avc1.4D401F",RESOLUTION=1920x1080,AUDIO="audio-aacl-152",CLOSED-CAPTIONS=NONE +22679-jqh9gFKRm8YDnC2-audio=152016-video=3883000.m3u8 + +# variants +#EXT-X-STREAM-INF:BANDWIDTH=136000,CODECS="mp4a.40.2",AUDIO="audio-aacl-128" +22679-jqh9gFKRm8YDnC2-audio=128019.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=162000,CODECS="mp4a.40.2",AUDIO="audio-aacl-152" +22679-jqh9gFKRm8YDnC2-audio=152016.m3u8 + +# keyframes +#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=44000,CODECS="avc1.4D401F",RESOLUTION=426x240,URI="keyframes/22679-jqh9gFKRm8YDnC2-video=327000.m3u8" +#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=103000,CODECS="avc1.4D401F",RESOLUTION=640x360,URI="keyframes/22679-jqh9gFKRm8YDnC2-video=771000.m3u8" +#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=197000,CODECS="avc1.4D401F",RESOLUTION=1024x576,URI="keyframes/22679-jqh9gFKRm8YDnC2-video=1484000.m3u8" +#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=376000,CODECS="avc1.4D401F",RESOLUTION=1280x720,URI="keyframes/22679-jqh9gFKRm8YDnC2-video=2831000.m3u8" +#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=515000,CODECS="avc1.4D401F",RESOLUTION=1920x1080,URI="keyframes/22679-jqh9gFKRm8YDnC2-video=3883000.m3u8" +] \ No newline at end of file From 15aad3efded9a5e92d1060ecebef69df68da8c88 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 2 May 2024 23:59:35 +0200 Subject: [PATCH 08/15] add missing protocoll --- .../mserver/crawler/sr/tasks/SrFilmDetailTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java index 99cf79b7b..9842beccb 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java +++ b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java @@ -154,7 +154,7 @@ protected void processDocument(final SrTopicUrlDTO aUrlDTO, final Document aDocu if (videoInfo.getSubtitleUrl().isPresent()) { for (String url : videoInfo.getSubtitleUrl().get()) { try { - film.addSubtitle(new URL(url)); + film.addSubtitle(new URL(addMissingProtocol(url))); } catch (Exception e) { LOG.error("invalid subtitle url {} {}", url, e); } From 74baba9ec0c4774098f9f9c75d9cf03865f9c848 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Fri, 3 May 2024 17:49:16 +0200 Subject: [PATCH 09/15] sonar --- .../crawler/ard/json/ArdFilmDeserializer.java | 50 ++++++++----------- .../crawler/ard/json/ArdVideoInfoDto.java | 9 ++-- .../json/ArdVideoInfoJsonDeserializer.java | 2 +- .../crawler/sr/tasks/SrFilmDetailTask.java | 1 - 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 1dd09e36d..68db325c7 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -74,7 +74,7 @@ private static Optional getMediaCollectionObject(final JsonObject it if (mc.isEmpty()) { return Optional.empty(); } - return Optional.of(JsonUtils.getElement(itemObject, ELEMENT_MEDIA_COLLECTION, ELEMENT_EMBEDDED).get().getAsJsonObject()); + return Optional.of(mc.get().getAsJsonObject()); } private static Optional parseTopic(final JsonObject playerPageObject) { @@ -132,7 +132,7 @@ private Optional> prepareSubtitleUrl(final JsonElement embeddedEleme Optional sources = JsonUtils.getElement(subtitle.get().getAsJsonArray().get(0), ELEMENT_SOURCES); if (sources.isEmpty() || !sources.get().isJsonArray()) return Optional.empty(); - Set urls = new HashSet(); + Set urls = new HashSet<>(); for (JsonElement url : sources.get().getAsJsonArray()) { JsonUtils.getElementValueAsString(url, ATTRIBUTE_URL).ifPresent(urls::add); } @@ -164,35 +164,30 @@ public List deserialize( final Optional date = parseDate(itemObject); final Optional duration = parseDuration(itemObject); final Sender sender = determinePartner(itemObject); - final Optional videoInfo = parseVideos(itemObject, title); + final Optional videoInfo = parseVideos(itemObject); if (title.isEmpty() || topic.isEmpty() || videoInfo.isEmpty()) { return films; } - // normal - if (videoInfo.isPresent()) { - // add film to ARD - final ArdFilmDto filmDto = - new ArdFilmDto( - createFilm( - sender, - topic.get(), - title.get(), - description.orElse(null), - date.orElse(null), - duration.orElse(null), - videoInfo.get())); - if (widgets.size() > 1) { - parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); - } - films.add(filmDto); + // add film to ARD + final ArdFilmDto filmDto = + new ArdFilmDto( + createFilm( + sender, + topic.get(), + title.get(), + description.orElse(null), + date.orElse(null), + duration.orElse(null), + videoInfo.get())); + if (widgets.size() > 1) { + parseRelatedFilms(filmDto, widgets.get(1).getAsJsonObject()); } - + films.add(filmDto); return films; } private Optional> fallbackToM3U(Optional m3u) { - // FUNK provides adaptive only if (m3u.isPresent() && !m3u.get().getVideoUrls().isEmpty()) { String m3uUrl = m3u.get().getVideoUrls().values().toArray(new String[1])[0]; Map resolutionUrlMapFromM3U; @@ -204,8 +199,7 @@ private Optional> fallbackToM3U(Optional videoUrls } } - private Optional parseVideos(final JsonObject playerPageObject, Optional title) { + private Optional parseVideos(final JsonObject playerPageObject) { ArdVideoInfoDto allVideoUrls = new ArdVideoInfoDto(); // final Optional> videoInfoStandard = parseVideoUrls(playerPageObject, "main", "standard", "video/mp4"); @@ -401,10 +395,10 @@ private Optional> parseVideoUrls(final JsonObject player Optional audios = JsonUtils.getElement(video, ELEMENT_AUDIO); if (audios.isPresent() && audios.get().isJsonArray() && audios.get().getAsJsonArray().size() > 0) { Optional kind = JsonUtils.getElementValueAsString(audios.get().getAsJsonArray().get(0), ATTRIBUTE_KIND); - Optional res_h = JsonUtils.getElementValueAsString(video, ATTRIBUTE_RESOLUTION_H); + Optional resh = JsonUtils.getElementValueAsString(video, ATTRIBUTE_RESOLUTION_H); Optional url = JsonUtils.getElementValueAsString(video, ATTRIBUTE_URL); - if (url.isPresent() && res_h.isPresent() && kind.isPresent() && kind.get().equalsIgnoreCase(aduioType)) { - Resolution resolution = Resolution.getResolutionFromWidth(Integer.parseInt(res_h.get())); + if (url.isPresent() && resh.isPresent() && kind.isPresent() && kind.get().equalsIgnoreCase(aduioType)) { + Resolution resolution = Resolution.getResolutionFromWidth(Integer.parseInt(resh.get())); videoInfo.put(resolution, url.get()); } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java index 1d3bba7c5..883922182 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoDto.java @@ -2,6 +2,7 @@ import de.mediathekview.mlib.daten.Resolution; +import java.util.Collection; import java.util.EnumMap; import java.util.Map; import java.util.Map.Entry; @@ -35,7 +36,7 @@ public Resolution getDefaultQuality() { return Resolution.NORMAL; } return Stream.of(videoUrls.keySet(), videoUrlsAD.keySet(), videoUrlsDGS.keySet()) - .flatMap(map -> map.stream()) + .flatMap(Set::stream) .findFirst() .orElse(Resolution.SMALL); } @@ -49,7 +50,7 @@ public String getDefaultVideoUrl() { return videoUrlsDGS.get(getDefaultQuality()); } return Stream.of(videoUrls.values(), videoUrlsAD.values(), videoUrlsDGS.values()) - .flatMap(map -> map.stream()) + .flatMap(Collection::stream) .findFirst() .orElse(null); @@ -63,10 +64,6 @@ public void setSubtitleUrl(final Optional> subtitleUrl) { this.subtitleUrl = subtitleUrl; } - public Optional> getSubtitleUrlOptional() { - return subtitleUrl; - } - public Map getVideoUrls() { return videoUrls; } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java index a22357c22..a715a006c 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdVideoInfoJsonDeserializer.java @@ -47,7 +47,7 @@ public ArdVideoInfoDto deserialize( final ArdVideoInfoDto videoInfo = new ArdVideoInfoDto(); final JsonElement subtitleElement = aJsonElement.getAsJsonObject().get(ELEMENT_SUBTITLE_URL); if (subtitleElement != null && !subtitleElement.isJsonNull()) { - Set singleUrl = new HashSet(); + Set singleUrl = new HashSet<>(); singleUrl.add(subtitleElement.getAsString()); videoInfo.setSubtitleUrl(Optional.of(singleUrl)); } diff --git a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java index 9842beccb..9f1cba717 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java +++ b/src/main/java/de/mediathekview/mserver/crawler/sr/tasks/SrFilmDetailTask.java @@ -13,7 +13,6 @@ import de.mediathekview.mserver.crawler.basic.AbstractDocumentTask; import de.mediathekview.mserver.crawler.basic.AbstractUrlTask; import de.mediathekview.mserver.crawler.sr.SrTopicUrlDTO; -import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.jsoup.nodes.Document; import org.jsoup.nodes.Node; From 67be16c6b11a88fd1d50a8645864c2710ac195a5 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Fri, 3 May 2024 18:22:59 +0200 Subject: [PATCH 10/15] more sonar --- .../crawler/ard/json/ArdFilmDeserializer.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 68db325c7..79d3f499a 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -58,8 +58,12 @@ public class ArdFilmDeserializer implements JsonDeserializer> { private static final String ATTRIBUTE_MIME = "mimeType"; private static final String ATTRIBUTE_KIND = "kind"; - - + private static final String MARKER_VIDEO_MP4 = "video/mp4"; + private static final String MARKER_VIDEO_STANDARD = "standard"; + private static final String MARKER_VIDEO_CATEGORY_MAIN = "main"; + private static final String MARKER_VIDEO_CATEGORY_MPEG = "application/vnd.apple.mpegurl"; + private static final String MARKER_VIDEO_AD = "audio-description"; + private static final String MARKER_VIDEO_DGS = "sign-language"; private final ArdVideoInfoJsonDeserializer videoDeserializer; private final AbstractCrawler crawler; @@ -343,10 +347,10 @@ private void addDGSUrls(final Film film, final Map videoUrls private Optional parseVideos(final JsonObject playerPageObject) { ArdVideoInfoDto allVideoUrls = new ArdVideoInfoDto(); // - final Optional> videoInfoStandard = parseVideoUrls(playerPageObject, "main", "standard", "video/mp4"); - final Optional> videoInfoAdaptive = parseVideoUrls(playerPageObject, "main", "standard", "application/vnd.apple.mpegurl"); - final Optional> videoInfoAD = parseVideoUrls(playerPageObject, "main", "audio-description", "video/mp4"); - final Optional> videoInfoDGS = parseVideoUrls(playerPageObject, "sign-language", "standard", "video/mp4"); + final Optional> videoInfoStandard = parseVideoUrls(playerPageObject, MARKER_VIDEO_CATEGORY_MAIN, MARKER_VIDEO_STANDARD, MARKER_VIDEO_MP4); + final Optional> videoInfoAdaptive = parseVideoUrls(playerPageObject, MARKER_VIDEO_CATEGORY_MAIN, MARKER_VIDEO_STANDARD, MARKER_VIDEO_CATEGORY_MPEG); + final Optional> videoInfoAD = parseVideoUrls(playerPageObject, MARKER_VIDEO_CATEGORY_MAIN, MARKER_VIDEO_AD, MARKER_VIDEO_MP4); + final Optional> videoInfoDGS = parseVideoUrls(playerPageObject, MARKER_VIDEO_DGS, MARKER_VIDEO_STANDARD, MARKER_VIDEO_MP4); final Optional> subtitles = prepareSubtitleUrl(playerPageObject); // if (subtitles.isPresent()) { From aeb33aa75d953f84bd7050f064c26bb850dd60f7 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Wed, 8 May 2024 20:21:11 +0200 Subject: [PATCH 11/15] partner filter --- .../mserver/crawler/ard/ArdConstants.java | 27 ++++++++ .../crawler/ard/json/ArdFilmDeserializer.java | 63 ++++++++++++++----- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java index 9dda8bea8..1a632a9ca 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java @@ -1,5 +1,10 @@ package de.mediathekview.mserver.crawler.ard; +import java.util.HashMap; +import java.util.Map; + +import de.mediathekview.mlib.daten.Sender; + public class ArdConstants { public static final String API_URL = "https://api.ardmediathek.de"; @@ -38,6 +43,28 @@ public class ArdConstants { "arte" }; + public static final Map PARTNER_TO_SENDER = new HashMap<>(); + + static { + PARTNER_TO_SENDER.put("rbb", Sender.RBB); + PARTNER_TO_SENDER.put("swr", Sender.SWR); + PARTNER_TO_SENDER.put("mdr", Sender.MDR); + PARTNER_TO_SENDER.put("ndr", Sender.NDR); + PARTNER_TO_SENDER.put("wdr", Sender.WDR); + PARTNER_TO_SENDER.put("hr", Sender.HR); + PARTNER_TO_SENDER.put("br", Sender.BR); + PARTNER_TO_SENDER.put("radio_bremen", Sender.RBTV); + PARTNER_TO_SENDER.put("tagesschau24", Sender.ARD); + PARTNER_TO_SENDER.put("das_erste", Sender.ARD); + PARTNER_TO_SENDER.put("one", Sender.ONE); // ONE + PARTNER_TO_SENDER.put("ard-alpha", Sender.ARD_ALPHA); // ARD-alpha + PARTNER_TO_SENDER.put("funk", Sender.FUNK); // Funk.net + PARTNER_TO_SENDER.put("sr", Sender.SR); + PARTNER_TO_SENDER.put("phoenix", Sender.PHOENIX); + PARTNER_TO_SENDER.put("ard", Sender.ARD); + //IGNORED_SENDER "zdf", "kika", "3sat", "arte" + } + public static final String WEBSITE_URL = "https://www.ardmediathek.de/video/%s"; public static final String BASE_URL_SUBTITLES = "https://classic.ardmediathek.de"; diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 79d3f499a..4c7dd8beb 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -167,12 +167,30 @@ public List deserialize( JsonUtils.getAttributeAsString(itemObject, ATTRIBUTE_SYNOPSIS); final Optional date = parseDate(itemObject); final Optional duration = parseDuration(itemObject); - final Sender sender = determinePartner(itemObject); - final Optional videoInfo = parseVideos(itemObject); - + //final Sender sender = determinePartner(itemObject); + final Optional partner = parsePartner(itemObject); + final Sender sender = ArdConstants.PARTNER_TO_SENDER.get(partner.orElse("")); + final Optional videoInfo = parseVideos(itemObject, title.orElse("")); + + if(title.orElse("").contains("- Die Antwort auf fast")) { + + System.out.println("stop"); + } + if (title.isEmpty() || topic.isEmpty() || videoInfo.isEmpty()) { return films; } + + if (sender == null) { + LOG.error("Missing Partner {}", partner.orElse("")); + if (partner.isEmpty()) { + LOG.error("Missing Partner Element {}", jsonElement); + } + + return films; + } + + // add film to ARD final ArdFilmDto filmDto = new ArdFilmDto( @@ -215,19 +233,26 @@ private Optional parseTitle(final JsonObject playerPageObject) { return title.map(nonNullTitle -> nonNullTitle.replace("Hörfassung", "Audiodeskription")); } - + /* private Sender determinePartner(JsonObject playerPageObject) { final Optional partner = parsePartner(playerPageObject); - final Sender sender; // If partner is present and an existing sender set it. Like for RBB + Sender partnerSender = null; if (partner.isPresent()) { - final Optional additionalSender = Sender.getSenderByName(partner.get()); - sender = additionalSender.orElse(Sender.ARD); + partnerSender = ArdConstants.PARTNER_TO_SENDER.get(partner.get()); + if (partnerSender != null) { + return partnerSender; + } else { + partnerSender = Sender.ARD; + LOG.info("unkown partner {}", partner.get() ); + } } else { - sender = Sender.ARD; + partnerSender = Sender.ARD; + LOG.info("missing partner {}", playerPageObject); } - return sender; - } + return partnerSender; + + } */ private Optional parsePartner(final JsonObject playerPageObject) { if (playerPageObject.has(ELEMENT_PUBLICATION_SERVICE)) { @@ -344,7 +369,7 @@ private void addDGSUrls(final Film film, final Map videoUrls } } - private Optional parseVideos(final JsonObject playerPageObject) { + private Optional parseVideos(final JsonObject playerPageObject, final String title) { ArdVideoInfoDto allVideoUrls = new ArdVideoInfoDto(); // final Optional> videoInfoStandard = parseVideoUrls(playerPageObject, MARKER_VIDEO_CATEGORY_MAIN, MARKER_VIDEO_STANDARD, MARKER_VIDEO_MP4); @@ -362,9 +387,10 @@ private Optional parseVideos(final JsonObject playerPageObject) if (videoInfoDGS.isPresent()) { allVideoUrls.putAllDGS(videoInfoDGS.get()); } - if (videoInfoStandard.isPresent()) { + // Sometimes we have DGS & standard + if (videoInfoStandard.isPresent() && !(videoInfoDGS.isPresent() && title.contains("Gebärdensprache"))) { allVideoUrls.putAll(videoInfoStandard.get()); - } else if (videoInfoAdaptive.isPresent()) { + } else if (videoInfoAdaptive.isPresent() && !(videoInfoDGS.isPresent() && title.contains("Gebärdensprache"))) { ArdVideoInfoDto fallbackM3UUrl = new ArdVideoInfoDto(); fallbackM3UUrl.putAll(videoInfoAdaptive.get()); Optional> fallback = fallbackToM3U(Optional.of(fallbackM3UUrl)); @@ -410,10 +436,15 @@ private Optional> parseVideoUrls(final JsonObject player } } } - if (videoInfo.size() > 0) { - return Optional.of(videoInfo); - } else { + if (videoInfo.size() == 0) { return Optional.empty(); } + // TODO: FIX ME + if (!videoInfo.containsKey(Resolution.NORMAL)) { + Resolution r = videoInfo.keySet().stream().findFirst().get(); + videoInfo.put(Resolution.NORMAL, videoInfo.get(r)); + videoInfo.remove(r); + } + return Optional.of(videoInfo); } } From fc4bf1f9841c4fcb2471c047c13f65afaea14b1d Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 9 May 2024 13:04:18 +0200 Subject: [PATCH 12/15] ignore certain partners --- .../mserver/crawler/ard/ArdConstants.java | 5 ++- .../crawler/ard/json/ArdFilmDeserializer.java | 9 ++---- .../ard/json/ArdTeasersDeserializer.java | 18 +++++++++++ .../ard/json/ArdTopicsLetterDeserializer.java | 31 ++++++++++++++----- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java index 1a632a9ca..8381fec75 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java @@ -36,11 +36,10 @@ public class ArdConstants { "swr", "wdr", "one", + "funk", "alpha", "tagesschau24", - "funk", - "phoenix", - "arte" + "phoenix" }; public static final Map PARTNER_TO_SENDER = new HashMap<>(); diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 4c7dd8beb..529d7bb7f 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -172,21 +172,16 @@ public List deserialize( final Sender sender = ArdConstants.PARTNER_TO_SENDER.get(partner.orElse("")); final Optional videoInfo = parseVideos(itemObject, title.orElse("")); - if(title.orElse("").contains("- Die Antwort auf fast")) { - - System.out.println("stop"); - } - if (title.isEmpty() || topic.isEmpty() || videoInfo.isEmpty()) { return films; } if (sender == null) { - LOG.error("Missing Partner {}", partner.orElse("")); if (partner.isEmpty()) { LOG.error("Missing Partner Element {}", jsonElement); + } else { + LOG.error("Ignore Partner {}", partner.get()); } - return films; } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java index 7c26fd570..27d4e42b9 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTeasersDeserializer.java @@ -21,9 +21,13 @@ abstract class ArdTeasersDeserializer { private static final String ATTRIBUTE_ID = "id"; private static final String ATTRIBUTE_NUMBER_OF_CLIPS = "numberOfClips"; + private static final String ELEMENT_PUBLICATION_SERVICE = "publicationService"; + private static final String ATTRIBUTE_PARTNER = "partner"; + Set parseTeasers(final JsonArray teasers) { return StreamSupport.stream(teasers.spliterator(), true) .map(JsonElement::getAsJsonObject) + .filter(this::isRelevant) .map(this::toFilmInfo) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -55,4 +59,18 @@ private ArdFilmInfoDto createFilmInfo(final String id, final int numberOfClips) final String url = String.format(ArdConstants.ITEM_URL, id); return new ArdFilmInfoDto(id, url, numberOfClips); } + + private boolean isRelevant(final JsonObject teaserObject) { + if (teaserObject.has(ELEMENT_PUBLICATION_SERVICE)) { + final JsonObject publicationService = + teaserObject.get(ELEMENT_PUBLICATION_SERVICE).getAsJsonObject(); + final Optional attributeAsString = + JsonUtils.getAttributeAsString(publicationService, ATTRIBUTE_PARTNER); + if (attributeAsString.isPresent()) { + return ArdConstants.PARTNER_TO_SENDER.get(attributeAsString.get()) != null; + } + } + + return true; + } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializer.java index 6abb20843..fc55746eb 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializer.java @@ -23,6 +23,8 @@ public class ArdTopicsLetterDeserializer implements JsonDeserializer parseTeaser(final JsonObject teaserObject) { } else { id = JsonUtils.getAttributeAsString(teaserObject, ATTRIBUTE_ID); } - - id.ifPresent( - nonNullId -> - results.add( - new CrawlerUrlDTO( - String.format( - ArdConstants.TOPIC_URL, nonNullId, ArdConstants.TOPIC_PAGE_SIZE)))); + if (isRelevant(teaserObject)) { + id.ifPresent( + nonNullId -> + results.add( + new CrawlerUrlDTO( + String.format( + ArdConstants.TOPIC_URL, nonNullId, ArdConstants.TOPIC_PAGE_SIZE)))); + } return results; } + + private boolean isRelevant(final JsonObject teaserObject) { + if (teaserObject.has(ELEMENT_PUBLICATION_SERVICE)) { + final JsonObject publicationService = + teaserObject.get(ELEMENT_PUBLICATION_SERVICE).getAsJsonObject(); + final Optional attributeAsString = + JsonUtils.getAttributeAsString(publicationService, ATTRIBUTE_PARTNER); + if (attributeAsString.isPresent()) { + return ArdConstants.PARTNER_TO_SENDER.get(attributeAsString.get()) != null; + } + } + + return true; + } } From 1ba399b660a4821f16cae641344ab180c13fbc28 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 9 May 2024 13:16:44 +0200 Subject: [PATCH 13/15] update test case --- .../ard/json/ArdFilmDeserializerTest.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 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 b82c59de9..baf41eb93 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 @@ -125,9 +125,9 @@ public static Collection data() { /*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.....", /*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", - /*normal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_960x540-50p-1600kbit.mp4", - /*hd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_1280x720-50p-3200kbit.mp4", + /*small*/ "", + /*normal*/ "", + /*hd*/ "", /*ADsmall*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_640x360-50p-1200kbit.mp4", /*ADnormal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_960x540-50p-1600kbit.mp4", /*ADhd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_1280x720-50p-3200kbit.mp4", @@ -357,31 +357,34 @@ public void test() { final ArdFilmDeserializer target = new ArdFilmDeserializer(createCrawler()); final List actualFilms = target.deserialize(jsonElement, null, null); - - assertThat(actualFilms.size(), equalTo(expectedFilmCount)); final ArdFilmDto[] films = actualFilms.toArray(new ArdFilmDto[] {}); - //AssertFilm.toTestCase("", films[0].getFilm()) - AssertFilm.assertEquals( - films[0].getFilm(), - additionalSender.orElse(Sender.ARD), - expectedTopic, - expectedTitle, - expectedDateTime, - expectedDuration, - expectedDescription, - "", // website - new GeoLocations[] {expectedGeo}, - expectedUrlSmall, - expectedUrlNormal, - expectedUrlHd, - expectedDGSUrlSmall, - expectedDGSUrlNormal, - expectedDGSUrlHd, - expectedADUrlSmall, - expectedADUrlNormal, - expectedADUrlHd, - expectedSubtitle); - assertThat(films[0].getRelatedFilms(), Matchers.containsInAnyOrder(relatedFilms)); + if (additionalSender.get().equals(Sender.KIKA)) { + // ignore kika + assertThat(actualFilms.size(), equalTo(0)); + } else { + assertThat(actualFilms.size(), equalTo(expectedFilmCount)); + AssertFilm.assertEquals( + films[0].getFilm(), + additionalSender.orElse(Sender.ARD), + expectedTopic, + expectedTitle, + expectedDateTime, + expectedDuration, + expectedDescription, + "", // website + new GeoLocations[] {expectedGeo}, + expectedUrlSmall, + expectedUrlNormal, + expectedUrlHd, + expectedDGSUrlSmall, + expectedDGSUrlNormal, + expectedDGSUrlHd, + expectedADUrlSmall, + expectedADUrlNormal, + expectedADUrlHd, + expectedSubtitle); + assertThat(films[0].getRelatedFilms(), Matchers.containsInAnyOrder(relatedFilms)); + } } protected ArdCrawler createCrawler() { From 94be6d1217f9aea852bd97c6fd08a3be801cd7d4 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Fri, 17 May 2024 21:11:39 +0200 Subject: [PATCH 14/15] clean title for UT,AD --- .../crawler/ard/json/ArdFilmDeserializer.java | 35 ++++++------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java index 529d7bb7f..e5861ad28 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdFilmDeserializer.java @@ -185,7 +185,6 @@ public List deserialize( return films; } - // add film to ARD final ArdFilmDto filmDto = new ArdFilmDto( @@ -223,31 +222,19 @@ private Optional> fallbackToM3U(Optional parseTitle(final JsonObject playerPageObject) { - final Optional title = - JsonUtils.getAttributeAsString(playerPageObject, ATTRIBUTE_TITLE); - return title.map(nonNullTitle -> nonNullTitle.replace("Hörfassung", "Audiodeskription")); - } - - /* - private Sender determinePartner(JsonObject playerPageObject) { - final Optional partner = parsePartner(playerPageObject); - // If partner is present and an existing sender set it. Like for RBB - Sender partnerSender = null; - if (partner.isPresent()) { - partnerSender = ArdConstants.PARTNER_TO_SENDER.get(partner.get()); - if (partnerSender != null) { - return partnerSender; - } else { - partnerSender = Sender.ARD; - LOG.info("unkown partner {}", partner.get() ); + Optional title = JsonUtils.getAttributeAsString(playerPageObject, ATTRIBUTE_TITLE); + if (title.isPresent()) { + String[] replaceWords = {" - Hörfassung", " (mit Gebärdensprache)", " mit Gebärdensprache"," (mit Audiodeskription)", "Audiodeskription"}; + String cleanTitle = title.get().trim(); + for (String replaceWord : replaceWords) { + cleanTitle = cleanTitle.replace(replaceWord, ""); } - } else { - partnerSender = Sender.ARD; - LOG.info("missing partner {}", playerPageObject); + cleanTitle = cleanTitle.trim(); + return Optional.of(cleanTitle); } - return partnerSender; - - } */ + return title; + } + private Optional parsePartner(final JsonObject playerPageObject) { if (playerPageObject.has(ELEMENT_PUBLICATION_SERVICE)) { From f776eddc196efea666e499d71493a0cf5786f6b1 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Sat, 18 May 2024 09:16:29 +0200 Subject: [PATCH 15/15] fix test for new AD,DGS title --- .../crawler/ard/json/ArdFilmDeserializerTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 baf41eb93..43423b5e8 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 @@ -100,7 +100,7 @@ public static Collection data() { { /*jsonFile*/ "/ard/ard_item_DGS_AD.json", /*topic*/ "Sesamstraße Magazin", - /*title*/ "Die schlaflose Eule (mit Gebärdensprache)", + /*title*/ "Die schlaflose Eule x", /*description*/ "2893. Ernie & Jan Delay bringen den müden Bert mit ihrem Lied um seinen nächtlichen Schlaf. In einer neuen Sesamstraßen Reihe nehmen uns Kinder mit an ihre \"Lieblingsorte\". Heute besuchen wir mit Elli (4), Jonathan (5) und Mattis (8) das nächtliche Miniaturwunderland. Außerdem hat der Prinz Probleme damit, Dornröschen zu wecken und Krümelmonster bringt Abby zur Verzweiflung. Susi Schraube erfindet\n.....", /*date*/ LocalDateTime.parse("2024-02-19T07:45"), /*duration*/ Duration.parse("PT20M26S"), @@ -121,13 +121,13 @@ public static Collection data() { { /*jsonFile*/ "/ard/ard_item_DGS_UT_AD.json", /*topic*/ "Tatort", - /*title*/ "Der Fluch des Geldes (mit Gebärdensprache)", + /*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.....", /*date*/ LocalDateTime.parse("2024-01-28T20:15"), /*duration*/ Duration.parse("PT1H28M33S"), - /*small*/ "", - /*normal*/ "", - /*hd*/ "", + /*small*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_640x360-50p-1200kbit.mp4", + /*normal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_960x540-50p-1600kbit.mp4", + /*hd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430813_sendeton_1280x720-50p-3200kbit.mp4", /*ADsmall*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_640x360-50p-1200kbit.mp4", /*ADnormal*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_960x540-50p-1600kbit.mp4", /*ADhd*/ "https://pd-videos.daserste.de/int/2024/01/18/3322bac1-6935-4101-8e41-380d70eff67e/JOB_430814_internationalerton_1280x720-50p-3200kbit.mp4",