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 657e47eaa..9ab878890 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdConstants.java @@ -7,11 +7,13 @@ public class ArdConstants { public static final String ITEM_URL = API_URL + "/page-gateway/pages/ard/item/"; - public static final String TOPICS_URL = API_URL + "/page-gateway/pages/%s/shows/"; + 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/radiobremen/editorials/%s?pageNumber=0&pageSize=%s"; public static final String TOPIC_URL = API_URL + "/page-gateway/widgets/ard/asset/%s?pageSize=%d"; public static final String DAY_PAGE_URL = API_URL + "/page-gateway/compilations/%s/pastbroadcasts?startDateTime=%sT00:00:00.000Z&endDateTime=%sT23:59:59.000Z&pageNumber=0&pageSize=%d"; public static final int DAY_PAGE_SIZE = 100; + public static final int TOPICS_COMPILATION_PAGE_SIZE = 200; public static final int TOPIC_PAGE_SIZE = 50; public static final String DEFAULT_CLIENT = "ard"; diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdCrawler.java b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdCrawler.java index eb086d36f..98abf02ff 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/ArdCrawler.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/ArdCrawler.java @@ -5,10 +5,7 @@ import de.mediathekview.mlib.messages.listener.MessageListener; import de.mediathekview.mserver.base.config.MServerConfigManager; import de.mediathekview.mserver.base.messages.ServerMessages; -import de.mediathekview.mserver.crawler.ard.tasks.ArdDayPageTask; -import de.mediathekview.mserver.crawler.ard.tasks.ArdFilmDetailTask; -import de.mediathekview.mserver.crawler.ard.tasks.ArdTopicPageTask; -import de.mediathekview.mserver.crawler.ard.tasks.ArdTopicsOverviewTask; +import de.mediathekview.mserver.crawler.ard.tasks.*; import de.mediathekview.mserver.crawler.basic.AbstractCrawler; import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; import de.mediathekview.mserver.progress.listeners.SenderProgressListener; @@ -76,6 +73,7 @@ protected RecursiveTask> createCrawlerTask() { for (final ForkJoinTask> senderTopicTask : senderTopicTasks) { senderTopicUrls.addAll(senderTopicTask.get()); } + LOG.debug("sender topic tasks: {}", senderTopicUrls.size()); final ArdTopicPageTask topicTask = new ArdTopicPageTask(this, new ConcurrentLinkedQueue<>(senderTopicUrls)); final int showsCountBefore = shows.size(); @@ -99,16 +97,27 @@ protected RecursiveTask> createCrawlerTask() { private Set>> createSenderTopicTasks() { final Set>> topicTasks = new HashSet<>(); - topicTasks.add(getTopicEntriesBySender(ArdConstants.DEFAULT_CLIENT)); + try { + topicTasks.add(getTopicEntriesBySender(ArdConstants.DEFAULT_CLIENT)); + } catch (ExecutionException | InterruptedException e) { + LOG.error("exception sender topic {}", ArdConstants.DEFAULT_CLIENT, e); + } for (final String client : ArdConstants.CLIENTS) { - topicTasks.add(getTopicEntriesBySender(client)); + try { + topicTasks.add(getTopicEntriesBySender(client)); + } catch (ExecutionException | InterruptedException e) { + LOG.error("exception sender topic {}", client, e); + } } return topicTasks; } - private ForkJoinTask> getTopicEntriesBySender(final String sender) { - return forkJoinPool.submit( - new ArdTopicsOverviewTask(this, sender, createTopicsOverviewUrl(sender))); + private ForkJoinTask> getTopicEntriesBySender(final String sender) throws ExecutionException, InterruptedException { + Set senderTopics = forkJoinPool.submit( + new ArdTopicsTask(this, sender, createTopicsOverviewUrl(sender))).get(); + + LOG.debug("topics task result {}", senderTopics.size()); + return forkJoinPool.submit(new ArdTopicsLetterTask(this, sender, new ConcurrentLinkedQueue<>(senderTopics))); } private Queue createTopicsOverviewUrl(final String client) { diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/PaginationUrlDto.java b/src/main/java/de/mediathekview/mserver/crawler/ard/PaginationUrlDto.java new file mode 100644 index 000000000..92a7210d7 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/PaginationUrlDto.java @@ -0,0 +1,40 @@ +package de.mediathekview.mserver.crawler.ard; + +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; + +import java.util.HashSet; +import java.util.Set; + +public class PaginationUrlDto { + private final Set urls = new HashSet<>(); + private int actualPage; + private int maxPages; + + public void addUrl(CrawlerUrlDTO url) { + urls.add(url); + } + + public void addAll(Set urls) { + this.urls.addAll(urls); + } + + public Set getUrls() { + return urls; + } + + public int getActualPage() { + return actualPage; + } + + public int getMaxPages() { + return maxPages; + } + + public void setActualPage(int actualPage) { + this.actualPage = actualPage; + } + + public void setMaxPages(int maxPages) { + this.maxPages = maxPages; + } +} diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializer.java new file mode 100644 index 000000000..bc94cfe16 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializer.java @@ -0,0 +1,51 @@ +package de.mediathekview.mserver.crawler.ard.json; + +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import de.mediathekview.mserver.base.utils.JsonUtils; +import de.mediathekview.mserver.crawler.ard.ArdConstants; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import java.lang.reflect.Type; +import java.util.*; + +public class ArdTopicsDeserializer implements JsonDeserializer> { + private static final String ELEMENT_WIDGETS = "widgets"; + private static final String ELEMENT_LINKS = "links"; + private static final String ELEMENT_SELF = "self"; + + private static final String ATTRIBUTE_ID = "id"; + + @Override + public Set deserialize( + JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) { + final Set result = new HashSet<>(); + + if (JsonUtils.hasElements(jsonElement, ELEMENT_WIDGETS)) { + final JsonArray widgets = jsonElement.getAsJsonObject().getAsJsonArray(ELEMENT_WIDGETS); + widgets.forEach(widget -> parseWidget(widget.getAsJsonObject()).ifPresent(result::add)); + } + + return result; + } + + private Optional parseWidget(final JsonElement compilation) { + if (JsonUtils.hasElements(compilation, ELEMENT_LINKS)) { + final JsonElement selfLink = + compilation.getAsJsonObject().get(ELEMENT_LINKS).getAsJsonObject().get(ELEMENT_SELF); + final Optional id = + JsonUtils.getAttributeAsString(selfLink.getAsJsonObject(), ATTRIBUTE_ID); + if (id.isPresent()) { + return Optional.of( + new CrawlerUrlDTO( + String.format( + ArdConstants.TOPICS_COMPILATION_URL, + id.get(), + ArdConstants.TOPICS_COMPILATION_PAGE_SIZE))); + } + } + + return Optional.empty(); + } +} 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 new file mode 100644 index 000000000..6abb20843 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializer.java @@ -0,0 +1,91 @@ +package de.mediathekview.mserver.crawler.ard.json; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import de.mediathekview.mserver.base.utils.JsonUtils; +import de.mediathekview.mserver.crawler.ard.ArdConstants; +import de.mediathekview.mserver.crawler.ard.PaginationUrlDto; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; + +import java.lang.reflect.Type; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +public class ArdTopicsLetterDeserializer implements JsonDeserializer { + + private static final String ELEMENT_TEASERS = "teasers"; + private static final String ELEMENT_LINKS = "links"; + private static final String ELEMENT_TARGET = "target"; + private static final String ELEMENT_PAGE_NUMBER = "pageNumber"; + private static final String ELEMENT_TOTAL_ELEMENTS = "totalElements"; + private static final String ELEMENT_PAGE_SIZE = "pageSize"; + private static final String ELEMENT_PAGINATION = "pagination"; + + private static final String ATTRIBUTE_ID = "id"; + + @Override + public PaginationUrlDto deserialize( + final JsonElement jsonElement, final Type type, final JsonDeserializationContext context) { + final PaginationUrlDto results = new PaginationUrlDto(); + + if (!jsonElement.getAsJsonObject().has(ELEMENT_TEASERS) + || !jsonElement.getAsJsonObject().get(ELEMENT_TEASERS).isJsonArray() + || jsonElement.getAsJsonObject().getAsJsonArray(ELEMENT_TEASERS).isEmpty()) { + return results; + } + + jsonElement.getAsJsonObject().getAsJsonArray(ELEMENT_TEASERS).forEach(teaser -> results.addAll(parseTeaser(teaser.getAsJsonObject()))); + + final JsonElement paginationElement = jsonElement.getAsJsonObject().get(ELEMENT_PAGINATION); + results.setActualPage(getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_PAGE_NUMBER)); + final int totalElements = getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_TOTAL_ELEMENTS); + final int pageSize = getChildElementAsIntOrNullIfNotExist(paginationElement, ELEMENT_PAGE_SIZE); + int maxPageSize = pageSize == 0 ? 0 : + (totalElements+pageSize-1)/pageSize; + results.setMaxPages(maxPageSize); + + return results; + } + + private int getChildElementAsIntOrNullIfNotExist( + final JsonElement parentElement, final String childElementName) { + if (parentElement == null || parentElement.isJsonNull()) { + return 0; + } + return getJsonElementAsIntOrNullIfNotExist( + parentElement.getAsJsonObject().get(childElementName)); + } + + private int getJsonElementAsIntOrNullIfNotExist(final JsonElement element) { + if (element.isJsonNull()) { + return 0; + } + return element.getAsInt(); + } + + private Set parseTeaser(final JsonObject teaserObject) { + final Set results = new HashSet<>(); + + final Optional id; + + if (JsonUtils.checkTreePath(teaserObject, null, ELEMENT_LINKS, ELEMENT_TARGET)) { + final JsonObject targetObject = + teaserObject.get(ELEMENT_LINKS).getAsJsonObject().get(ELEMENT_TARGET).getAsJsonObject(); + id = JsonUtils.getAttributeAsString(targetObject, ATTRIBUTE_ID); + } else { + id = JsonUtils.getAttributeAsString(teaserObject, ATTRIBUTE_ID); + } + + id.ifPresent( + nonNullId -> + results.add( + new CrawlerUrlDTO( + String.format( + ArdConstants.TOPIC_URL, nonNullId, ArdConstants.TOPIC_PAGE_SIZE)))); + + return results; + } +} diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializer.java deleted file mode 100644 index 2588a91d7..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializer.java +++ /dev/null @@ -1,91 +0,0 @@ -package de.mediathekview.mserver.crawler.ard.json; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import de.mediathekview.mserver.base.utils.JsonUtils; -import de.mediathekview.mserver.crawler.ard.ArdConstants; -import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; - -import java.lang.reflect.Type; -import java.util.HashSet; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; - -public class ArdTopicsOverviewDeserializer implements JsonDeserializer> { - - private static final String ELEMENT_COMPILATIONS = "compilations"; - private static final String ELEMENT_TEASERS = "teasers"; - private static final String ELEMENT_LINKS = "links"; - private static final String ELEMENT_TARGET = "target"; - private static final String ELEMENT_WIDGETS = "widgets"; - - private static final String ATTRIBUTE_ID = "id"; - - @Override - public Set deserialize( - final JsonElement jsonElement, final Type type, final JsonDeserializationContext context) { - final Set results = new HashSet<>(); - - if (!jsonElement.getAsJsonObject().has(ELEMENT_WIDGETS) - || !jsonElement.getAsJsonObject().get(ELEMENT_WIDGETS).isJsonArray() - || jsonElement.getAsJsonObject().getAsJsonArray(ELEMENT_WIDGETS).size() == 0 - || !jsonElement - .getAsJsonObject() - .getAsJsonArray(ELEMENT_WIDGETS) - .get(0) - .getAsJsonObject() - .has(ELEMENT_COMPILATIONS)) { - return results; - } - - final JsonObject compilationObject = - jsonElement - .getAsJsonObject() - .getAsJsonArray(ELEMENT_WIDGETS) - .get(0) - .getAsJsonObject() - .get(ELEMENT_COMPILATIONS) - .getAsJsonObject(); - - for (final Entry letterEntry : compilationObject.entrySet()) { - results.addAll(parseLetter(letterEntry.getValue().getAsJsonObject())); - } - - return results; - } - - private Set parseLetter(final JsonObject letterObject) { - final Set results = new HashSet<>(); - - if (!letterObject.getAsJsonObject().has(ELEMENT_TEASERS) - || !letterObject.getAsJsonObject().get(ELEMENT_TEASERS).isJsonArray()) { - return results; - } - - for (final JsonElement teaserElement : - letterObject.getAsJsonObject().getAsJsonArray(ELEMENT_TEASERS)) { - final JsonObject teaserObject = teaserElement.getAsJsonObject(); - final Optional id; - - if (JsonUtils.checkTreePath(teaserObject, null, ELEMENT_LINKS, ELEMENT_TARGET)) { - final JsonObject targetObject = - teaserObject.get(ELEMENT_LINKS).getAsJsonObject().get(ELEMENT_TARGET).getAsJsonObject(); - id = JsonUtils.getAttributeAsString(targetObject, ATTRIBUTE_ID); - } else { - id = JsonUtils.getAttributeAsString(teaserObject, ATTRIBUTE_ID); - } - - id.ifPresent( - nonNullId -> - results.add( - new CrawlerUrlDTO( - String.format( - ArdConstants.TOPIC_URL, nonNullId, ArdConstants.TOPIC_PAGE_SIZE)))); - } - - return results; - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsLetterTask.java b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsLetterTask.java new file mode 100644 index 000000000..dbdfede34 --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsLetterTask.java @@ -0,0 +1,79 @@ +package de.mediathekview.mserver.crawler.ard.tasks; + +import com.google.gson.reflect.TypeToken; +import de.mediathekview.mserver.crawler.ard.PaginationUrlDto; +import de.mediathekview.mserver.crawler.ard.json.ArdTopicsLetterDeserializer; +import de.mediathekview.mserver.crawler.basic.AbstractCrawler; +import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import jakarta.ws.rs.client.WebTarget; +import java.lang.reflect.Type; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ArdTopicsLetterTask extends ArdTaskBase { + private static final Logger LOG = LogManager.getLogger(ArdTopicsLetterTask.class); + private static final String PAGE_NUMBER = "pageNumber"; + private static final String URL_PAGE_NUMBER_REPLACE_REGEX = PAGE_NUMBER + "=\\d+"; + private static final String PAGE_NUMBER_URL_ENCODED = PAGE_NUMBER + "="; + private static final Type PAGINATION_URL_DTO_TYPE_TOKEN = + new TypeToken() {}.getType(); + private final String sender; + + public ArdTopicsLetterTask( + final AbstractCrawler crawler, + final String sender, + final Queue urlToCrawlDtos) { + super(crawler, urlToCrawlDtos); + this.sender = sender; + registerJsonDeserializer(PAGINATION_URL_DTO_TYPE_TOKEN, new ArdTopicsLetterDeserializer()); + } + + @Override + protected AbstractRecursiveConverterTask createNewOwnInstance( + final Queue aElementsToProcess) { + return new ArdTopicsLetterTask(crawler, sender, aElementsToProcess); + } + + @Override + protected void processRestTarget(final CrawlerUrlDTO aDTO, final WebTarget aTarget) { + final PaginationUrlDto results = deserialize(aTarget, PAGINATION_URL_DTO_TYPE_TOKEN, aDTO); + LOG.debug("Found {} shows for {}.", results.getUrls().size(), sender); + taskResults.addAll(results.getUrls()); + + if (results.getActualPage() == 0 && results.getMaxPages() > 1) { + final Queue subpages = createSubPageUrls(aTarget, results.getMaxPages()); + if (!subpages.isEmpty()) { + taskResults.addAll(createNewOwnInstance(subpages).fork().join()); + } + } + } + + private Queue createSubPageUrls(final WebTarget aTarget, final int maxPages) { + + return IntStream.range(1, maxPages) + .mapToObj(subpageNumber -> changePageNumber(aTarget, subpageNumber)) + .map(CrawlerUrlDTO::new) + .distinct() + .collect(Collectors.toCollection(ConcurrentLinkedQueue::new)); + } + + private String changePageNumber(final WebTarget aTarget, final int newPageNumber) { + return aTarget.getUri().toString().contains(PAGE_NUMBER) + ? aTarget + .getUriBuilder() + .replaceQuery( + aTarget + .getUri() + .getRawQuery() + .replaceAll( + URL_PAGE_NUMBER_REPLACE_REGEX, PAGE_NUMBER_URL_ENCODED + newPageNumber)) + .build() + .toString() + : aTarget.queryParam(PAGE_NUMBER, newPageNumber).getUri().toString(); + } +} diff --git a/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsOverviewTask.java b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsTask.java similarity index 54% rename from src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsOverviewTask.java rename to src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsTask.java index 9209625ee..03b2063de 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsOverviewTask.java +++ b/src/main/java/de/mediathekview/mserver/crawler/ard/tasks/ArdTopicsTask.java @@ -1,43 +1,40 @@ package de.mediathekview.mserver.crawler.ard.tasks; import com.google.gson.reflect.TypeToken; -import de.mediathekview.mserver.crawler.ard.json.ArdTopicsOverviewDeserializer; +import de.mediathekview.mserver.crawler.ard.json.ArdTopicsDeserializer; import de.mediathekview.mserver.crawler.basic.AbstractCrawler; import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import jakarta.ws.rs.client.WebTarget; import java.lang.reflect.Type; import java.util.Queue; import java.util.Set; -public class ArdTopicsOverviewTask extends ArdTaskBase { - private static final Logger LOG = LogManager.getLogger(ArdTopicsOverviewTask.class); - private static final Type SET_CRAWLER_URL_TYPE_TOKEN = - new TypeToken>() {}.getType(); +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ArdTopicsTask extends ArdTaskBase { + private static final Logger LOG = LogManager.getLogger(ArdTopicsTask.class); + private static final Type SET_CRAWLER_URL_TYPE_TOKEN = new TypeToken>() {}.getType(); private final String sender; - public ArdTopicsOverviewTask( - final AbstractCrawler crawler, - final String sender, - final Queue urlToCrawlDtos) { - super(crawler, urlToCrawlDtos); + public ArdTopicsTask(AbstractCrawler aCrawler, String sender, Queue urlToCrawlDTOs) { + super(aCrawler, urlToCrawlDTOs); this.sender = sender; - registerJsonDeserializer(SET_CRAWLER_URL_TYPE_TOKEN, new ArdTopicsOverviewDeserializer()); + registerJsonDeserializer(SET_CRAWLER_URL_TYPE_TOKEN, new ArdTopicsDeserializer()); } @Override protected AbstractRecursiveConverterTask createNewOwnInstance( - final Queue aElementsToProcess) { - return new ArdTopicsOverviewTask(crawler, sender, aElementsToProcess); + Queue aElementsToProcess) { + return new ArdTopicsTask(this.crawler, sender, aElementsToProcess); } @Override - protected void processRestTarget(final CrawlerUrlDTO aDTO, final WebTarget aTarget) { + protected void processRestTarget(CrawlerUrlDTO aDTO, WebTarget aTarget) { final Set results = deserialize(aTarget, SET_CRAWLER_URL_TYPE_TOKEN, aDTO); - LOG.debug("Found {} shows for {}.", results.size(), sender); + LOG.debug("Found {} topics for {}.", results.size(), sender); taskResults.addAll(results); + } } diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializerTest.java new file mode 100644 index 000000000..438c7b783 --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsDeserializerTest.java @@ -0,0 +1,60 @@ +package de.mediathekview.mserver.crawler.ard.json; + +import static org.junit.jupiter.api.Assertions.*; + +import com.google.gson.JsonElement; +import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; +import de.mediathekview.mserver.testhelper.JsonFileReader; +import java.util.Set; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; + +class ArdTopicsDeserializerTest { + @Test + void testDeserialize() { + final JsonElement jsonElement = JsonFileReader.readJson("/ard/ard_topic_page_sender_overview.json"); + + final CrawlerUrlDTO[] expected = + new CrawlerUrlDTO[] { + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uYg?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZA?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZQ?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZg?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uaA?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uag?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ubA?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ubg?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ucA?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ucg?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udA?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udQ?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udg?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udw?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ueQ?pageNumber=0&pageSize=200"), + new CrawlerUrlDTO( + "https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uIw?pageNumber=0&pageSize=200") + }; + + final ArdTopicsDeserializer target = new ArdTopicsDeserializer(); + final Set actual = target.deserialize(jsonElement, null, null); + + assertEquals(expected.length, actual.size()); + MatcherAssert.assertThat(actual, Matchers.containsInAnyOrder(expected)); + } +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializerTest.java similarity index 50% rename from src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializerTest.java rename to src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializerTest.java index 1ee49feb9..11b54895f 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsOverviewDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/ard/json/ArdTopicsLetterDeserializerTest.java @@ -1,43 +1,42 @@ package de.mediathekview.mserver.crawler.ard.json; import com.google.gson.JsonElement; +import de.mediathekview.mserver.crawler.ard.PaginationUrlDto; import de.mediathekview.mserver.crawler.basic.CrawlerUrlDTO; import de.mediathekview.mserver.testhelper.JsonFileReader; import org.hamcrest.Matchers; import org.junit.Test; -import java.util.Set; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -public class ArdTopicsOverviewDeserializerTest { +public class ArdTopicsLetterDeserializerTest { @Test public void testDeserialize() { - final JsonElement jsonElement = JsonFileReader.readJson("/ard/ard_topics.json"); + final JsonElement jsonElement = JsonFileReader.readJson("/ard/ard_topic_page.json"); final CrawlerUrlDTO[] expected = new CrawlerUrlDTO[] { new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlLzNuYWNoOQ?pageSize=50"), - new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW4?pageSize=50"), + "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW4?pageSize=50"), new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3Nwb3J0YmxpdHo?pageSize=50"), + "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX3Nwb3J0YmxpdHo?pageSize=50"), new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW51bTY?pageSize=50"), + "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW53ZXR0ZXI?pageSize=50"), new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW53ZXR0ZXI?pageSize=50"), + "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW51bTY?pageSize=50"), new CrawlerUrlDTO( - "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2Nvcm9uYQ?pageSize=50"), + "https://api.ardmediathek.de/page-gateway/widgets/ard/asset/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW5nZWJhZXJkZW5zcHJhY2hl?pageSize=50"), }; - final ArdTopicsOverviewDeserializer instance = new ArdTopicsOverviewDeserializer(); + final ArdTopicsLetterDeserializer instance = new ArdTopicsLetterDeserializer(); - final Set result = instance.deserialize(jsonElement, null, null); + final PaginationUrlDto result = instance.deserialize(jsonElement, null, null); - assertThat(result.size(), equalTo(expected.length)); - assertThat(result, Matchers.containsInAnyOrder(expected)); + assertThat(result.getUrls().size(), equalTo(expected.length)); + assertThat(result.getUrls(), Matchers.containsInAnyOrder(expected)); + assertThat(result.getActualPage(), equalTo(0)); + assertThat(result.getMaxPages(), equalTo(1)); } } diff --git a/src/test/resources/ard/ard_topic_page.json b/src/test/resources/ard/ard_topic_page.json new file mode 100644 index 000000000..6737a5038 --- /dev/null +++ b/src/test/resources/ard/ard_topic_page.json @@ -0,0 +1,413 @@ +{ + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uYg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":200, + "totalElements":5 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uYg", + "urlId":"UmFkaW9CcmVtZW4uYg", + "title":"B", + "href":"https://api.ardmediathek.de/page-gateway/widgets/ard/editorials/UmFkaW9CcmVtZW4uYg?pageNumber=0&pageSize=200&embedded=true", + "type":"application/vnd.ard.widget+json", + "partner":"ard" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + { + "availableSeasons":null, + "binaryFeatures":[ + "DGS", + "AD" + ], + "coreAssetType":"INFINITE_SERIES", + "id":"urn:ard:show:008e3be2e23c986a", + "images":{ + "aspect16x9":{ + "alt":"Logo buten un binnen", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:bca6f57ebb4de810?w={width}&ch=1512640745f9782c", + "title":"Logo buten un binnen" + }, + "aspect16x7":{ + "alt":"Logo buten un binnen", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:28f3f024cb781e6e?w={width}&ch=964c6f142f463c54", + "title":"Logo buten un binnen" + }, + "aspect1x1":{ + "alt":"Logo buten un binnen", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:36285a892fd9b8d3?w={width}&ch=39487e9e744b682c", + "title":"Logo buten un binnen" + } + }, + "isChildContent":false, + "longTitle":"buten un binnen | regionalmagazin", + "mediumTitle":"buten un binnen | regionalmagazin", + "personalized":false, + "playtime":null, + "publicationService":{ + "name":"Radio Bremen", + "logo":{ + "title":"Logo Radio Bremen", + "alt":"Logo Radio Bremen", + "producerName":"Logo Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio":"16x9" + }, + "publisherType":"TV", + "partner":"radio_bremen", + "id":"b3JnYW5pemF0aW9uX1JhZGlvQnJlbWVu", + "coreId":"urn:ard:publisher:bc809dbaddf5ad61" + }, + "links":{ + "self":{ + "id":"urn:ard:show:008e3be2e23c986a", + "urlId":"urn:ard:show:008e3be2e23c986a", + "title":"buten un binnen | regionalmagazin", + "href":"https://api.ardmediathek.de/page-gateway/teasers/ard/editorials/urn%3Aard%3Ashow%3A008e3be2e23c986a", + "type":"application/vnd.ard.teaser+json", + "partner":"ard" + }, + "target":{ + "id":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW4", + "urlId":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW4", + "title":"buten un binnen | regionalmagazin", + "href":"https://api.ardmediathek.de/page-gateway/pages/ard/grouping/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW4?embedded=true", + "type":"application/vnd.ard.page+json", + "partner":"ard" + } + }, + "shortTitle":"buten un binnen | regionalmagazin", + "titleVisible":false, + "trackingPiano":{ + "teaser_content_type":"show", + "teaser_id":"urn:ard:show:008e3be2e23c986a", + "teaser_institution":"ARD", + "teaser_institution_id":"urn:ard:institution:453603d77920d274", + "teaser_title":"buten un binnen | regionalmagazin" + }, + "type":"show" + }, + { + "availableSeasons":null, + "binaryFeatures":[ + "UT" + ], + "coreAssetType":"INFINITE_SERIES", + "id":"urn:ard:show:949668b26db5b5d2", + "images":{ + "aspect16x9":{ + "alt":"Logo buten un binnen Sportblitz", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:cfd3d1a54b880770?w={width}&ch=1637f5f0866debc9", + "title":"Logo buten un binnen Sportblitz" + }, + "aspect16x7":{ + "alt":"Logo buten un binnen Sportblitz", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:00de993d65b59d53?w={width}&ch=85d63bd0caeb21f4", + "title":"Logo buten un binnen Sportblitz" + }, + "aspect1x1":{ + "alt":"Logo buten un binnen Sportblitz", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:455d7e52df1c57b3?w={width}&ch=a08635a2676c21c6", + "title":"Logo buten un binnen Sportblitz" + } + }, + "isChildContent":false, + "longTitle":"buten un binnen | sportblitz", + "mediumTitle":"buten un binnen | sportblitz", + "personalized":false, + "playtime":null, + "publicationService":{ + "name":"Radio Bremen", + "logo":{ + "title":"Logo Radio Bremen", + "alt":"Logo Radio Bremen", + "producerName":"Logo Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio":"16x9" + }, + "publisherType":"TV", + "partner":"radio_bremen", + "id":"b3JnYW5pemF0aW9uX1JhZGlvQnJlbWVu", + "coreId":"urn:ard:publisher:bc809dbaddf5ad61" + }, + "links":{ + "self":{ + "id":"urn:ard:show:949668b26db5b5d2", + "urlId":"urn:ard:show:949668b26db5b5d2", + "title":"buten un binnen | sportblitz", + "href":"https://api.ardmediathek.de/page-gateway/teasers/ard/editorials/urn%3Aard%3Ashow%3A949668b26db5b5d2", + "type":"application/vnd.ard.teaser+json", + "partner":"ard" + }, + "target":{ + "id":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX3Nwb3J0YmxpdHo", + "urlId":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX3Nwb3J0YmxpdHo", + "title":"buten un binnen | sportblitz", + "href":"https://api.ardmediathek.de/page-gateway/pages/ard/grouping/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX3Nwb3J0YmxpdHo?embedded=true", + "type":"application/vnd.ard.page+json", + "partner":"ard" + } + }, + "shortTitle":"buten un binnen | sportblitz", + "titleVisible":false, + "trackingPiano":{ + "teaser_content_type":"show", + "teaser_id":"urn:ard:show:949668b26db5b5d2", + "teaser_institution":"ARD", + "teaser_institution_id":"urn:ard:institution:453603d77920d274", + "teaser_title":"buten un binnen | sportblitz" + }, + "type":"show" + }, + { + "availableSeasons":null, + "binaryFeatures":[ + "UT" + ], + "coreAssetType":"INFINITE_SERIES", + "id":"urn:ard:show:877f633c894962f9", + "images":{ + "aspect16x9":{ + "alt":"Logo buten un binnen | wetter", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:6a6b2d894712ee80?w={width}&ch=13af9d08b6e8012d", + "title":"Logo buten un binnen | wetter" + }, + "aspect16x7":{ + "alt":"Logo buten un binnen | wetter", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:44e817a5195d2977?w={width}&ch=e0552707c8681a7b", + "title":"Logo buten un binnen | wetter" + }, + "aspect1x1":{ + "alt":"Logo buten un binnen | wetter", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:e0e5827ed386be43?w={width}&ch=851c40728ee14fd1", + "title":"Logo buten un binnen | wetter" + } + }, + "isChildContent":false, + "longTitle":"buten un binnen | wetter", + "mediumTitle":"buten un binnen | wetter", + "personalized":false, + "playtime":null, + "publicationService":{ + "name":"Radio Bremen", + "logo":{ + "title":"Logo Radio Bremen", + "alt":"Logo Radio Bremen", + "producerName":"Logo Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio":"16x9" + }, + "publisherType":"TV", + "partner":"radio_bremen", + "id":"b3JnYW5pemF0aW9uX1JhZGlvQnJlbWVu", + "coreId":"urn:ard:publisher:bc809dbaddf5ad61" + }, + "links":{ + "self":{ + "id":"urn:ard:show:877f633c894962f9", + "urlId":"urn:ard:show:877f633c894962f9", + "title":"buten un binnen | wetter", + "href":"https://api.ardmediathek.de/page-gateway/teasers/ard/editorials/urn%3Aard%3Ashow%3A877f633c894962f9", + "type":"application/vnd.ard.teaser+json", + "partner":"ard" + }, + "target":{ + "id":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW53ZXR0ZXI", + "urlId":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW53ZXR0ZXI", + "title":"buten un binnen | wetter", + "href":"https://api.ardmediathek.de/page-gateway/pages/ard/grouping/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW53ZXR0ZXI?embedded=true", + "type":"application/vnd.ard.page+json", + "partner":"ard" + } + }, + "shortTitle":"buten un binnen | wetter", + "titleVisible":false, + "trackingPiano":{ + "teaser_content_type":"show", + "teaser_id":"urn:ard:show:877f633c894962f9", + "teaser_institution":"ARD", + "teaser_institution_id":"urn:ard:institution:453603d77920d274", + "teaser_title":"buten un binnen | wetter" + }, + "type":"show" + }, + { + "availableSeasons":null, + "binaryFeatures":[ + "UT", + "DGS" + ], + "coreAssetType":"INFINITE_SERIES", + "id":"urn:ard:show:e746f957755bb08a", + "images":{ + "aspect16x9":{ + "alt":"Logo buten un binnen um 6", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:83380437c445399b?w={width}&ch=62f889efb4844ff0", + "title":"Logo buten un binnen um 6" + }, + "aspect16x7":{ + "alt":"Logo buten un binnen um 6", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:82e169cee014b674?w={width}&ch=deca4dee360c90a4", + "title":"Logo buten un binnen um 6" + }, + "aspect1x1":{ + "alt":"Logo buten un binnen um 6", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:09b6abc050d16958?w={width}&ch=e81684fb1f6ef5ea", + "title":"Logo buten un binnen um 6" + } + }, + "isChildContent":false, + "longTitle":"buten un binnen um 6", + "mediumTitle":"buten un binnen um 6", + "personalized":false, + "playtime":null, + "publicationService":{ + "name":"Radio Bremen", + "logo":{ + "title":"Logo Radio Bremen", + "alt":"Logo Radio Bremen", + "producerName":"Logo Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio":"16x9" + }, + "publisherType":"TV", + "partner":"radio_bremen", + "id":"b3JnYW5pemF0aW9uX1JhZGlvQnJlbWVu", + "coreId":"urn:ard:publisher:bc809dbaddf5ad61" + }, + "links":{ + "self":{ + "id":"urn:ard:show:e746f957755bb08a", + "urlId":"urn:ard:show:e746f957755bb08a", + "title":"buten un binnen um 6", + "href":"https://api.ardmediathek.de/page-gateway/teasers/ard/editorials/urn%3Aard%3Ashow%3Ae746f957755bb08a", + "type":"application/vnd.ard.teaser+json", + "partner":"ard" + }, + "target":{ + "id":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW51bTY", + "urlId":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW51bTY", + "title":"buten un binnen um 6", + "href":"https://api.ardmediathek.de/page-gateway/pages/ard/grouping/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL3NlbmRlcmVpaGVuL2lkX2J1dGVudW5iaW5uZW51bTY?embedded=true", + "type":"application/vnd.ard.page+json", + "partner":"ard" + } + }, + "shortTitle":"buten un binnen um 6", + "titleVisible":false, + "trackingPiano":{ + "teaser_content_type":"show", + "teaser_id":"urn:ard:show:e746f957755bb08a", + "teaser_institution":"ARD", + "teaser_institution_id":"urn:ard:institution:453603d77920d274", + "teaser_title":"buten un binnen um 6" + }, + "type":"show" + }, + { + "availableSeasons":null, + "binaryFeatures":[ + "DGS" + ], + "coreAssetType":"INFINITE_SERIES", + "id":"urn:ard:show:b330bb19d42e88b1", + "images":{ + "aspect16x9":{ + "alt":"Symbolbild Gebärdensprache", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:597a7769a070c62e?w={width}&ch=30bb509d092e6b9b", + "title":"Symbolbild Gebärdensprache" + }, + "aspect16x7":{ + "alt":"Symbolbild Gebärdensprache", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:81fc3a9f828abdd0?w={width}&ch=4883308db045ab2f", + "title":"Symbolbild Gebärdensprache" + }, + "aspect1x1":{ + "alt":"Symbolbild Gebärdensprache", + "producerName":"Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/images/urn:ard:image:3c730b98698ca399?w={width}&ch=0b6534d2cbdb60c6", + "title":"Symbolbild Gebärdensprache" + } + }, + "isChildContent":false, + "longTitle":"buten un binnen um 6 in Gebärdensprache", + "mediumTitle":"buten un binnen um 6 in Gebärdensprache", + "personalized":false, + "playtime":null, + "publicationService":{ + "name":"Radio Bremen", + "logo":{ + "title":"Logo Radio Bremen", + "alt":"Logo Radio Bremen", + "producerName":"Logo Radio Bremen", + "src":"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:2213972a8d101de1/16x9?w={width}", + "aspectRatio":"16x9" + }, + "publisherType":"TV", + "partner":"radio_bremen", + "id":"b3JnYW5pemF0aW9uX1JhZGlvQnJlbWVu", + "coreId":"urn:ard:publisher:bc809dbaddf5ad61" + }, + "links":{ + "self":{ + "id":"urn:ard:show:b330bb19d42e88b1", + "urlId":"urn:ard:show:b330bb19d42e88b1", + "title":"buten un binnen um 6 in Gebärdensprache", + "href":"https://api.ardmediathek.de/page-gateway/teasers/ard/editorials/urn%3Aard%3Ashow%3Ab330bb19d42e88b1", + "type":"application/vnd.ard.teaser+json", + "partner":"ard" + }, + "target":{ + "id":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW5nZWJhZXJkZW5zcHJhY2hl", + "urlId":"Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW5nZWJhZXJkZW5zcHJhY2hl", + "title":"buten un binnen um 6 in Gebärdensprache", + "href":"https://api.ardmediathek.de/page-gateway/pages/ard/grouping/Y3JpZDovL3JhZGlvYnJlbWVuLmRlL2J1dGVudW5iaW5uZW5nZWJhZXJkZW5zcHJhY2hl?embedded=true", + "type":"application/vnd.ard.page+json", + "partner":"ard" + } + }, + "shortTitle":"buten un binnen um 6 in Gebärdensprache", + "titleVisible":false, + "trackingPiano":{ + "teaser_content_type":"show", + "teaser_id":"urn:ard:show:b330bb19d42e88b1", + "teaser_institution":"ARD", + "teaser_institution_id":"urn:ard:institution:453603d77920d274", + "teaser_title":"buten un binnen um 6 in Gebärdensprache" + }, + "type":"show" + } + ], + "title":"B", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uYg", + "widget_title":"B", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" +} \ No newline at end of file diff --git a/src/test/resources/ard/ard_topic_page_sender_overview.json b/src/test/resources/ard/ard_topic_page_sender_overview.json new file mode 100644 index 000000000..bc2999cb6 --- /dev/null +++ b/src/test/resources/ard/ard_topic_page_sender_overview.json @@ -0,0 +1,633 @@ +{ + "description":"", + "descriptionSeo":"", + "id":"experiment-a-z", + "images":null, + "isChildContent":false, + "personalized":false, + "links":{ + "self":{ + "id":"experiment-a-z", + "urlId":"experiment-a-z", + "title":"", + "href":"https://api.ardmediathek.de/page-gateway/pages/radiobremen/editorial/experiment-a-z?embedded=false", + "type":"application/vnd.ard.page+json", + "partner":"radiobremen" + } + }, + "title":"", + "titleSeo":"", + "tracking":{ + "aggregationLevelId":44, + "atiCustomVars":{ + + }, + "chapter2":"Editorial", + "chapter3":"experiment-a-z", + "environmentId":511893, + "pageTitle":"Mediathek/Radio Bremen/experiment-a-z", + "szmType":"CP" + }, + "trackingPiano":{ + "page_chapter1":"Sendungen A-Z", + "page_id":"experiment-a-z", + "page_institution":"RadioBremen", + "page_institution_id":"urn:ard:institution:2d220b80d09056c8", + "page_title":"Sendungen A-Z", + "site":"634408" + }, + "widgets":[ + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uYg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":5 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uYg", + "urlId":"UmFkaW9CcmVtZW4uYg", + "title":"B", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uYg?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"B", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uYg", + "widget_title":"B", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uZA", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uZA", + "urlId":"UmFkaW9CcmVtZW4uZA", + "title":"D", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZA?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"D", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uZA", + "widget_title":"D", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uZQ", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uZQ", + "urlId":"UmFkaW9CcmVtZW4uZQ", + "title":"E", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZQ?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"E", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uZQ", + "widget_title":"E", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uZg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uZg", + "urlId":"UmFkaW9CcmVtZW4uZg", + "title":"F", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uZg?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"F", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uZg", + "widget_title":"F", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uaA", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uaA", + "urlId":"UmFkaW9CcmVtZW4uaA", + "title":"H", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uaA?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"H", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uaA", + "widget_title":"H", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uag", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uag", + "urlId":"UmFkaW9CcmVtZW4uag", + "title":"J", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uag?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"J", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uag", + "widget_title":"J", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4ubA", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4ubA", + "urlId":"UmFkaW9CcmVtZW4ubA", + "title":"L", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ubA?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"L", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4ubA", + "widget_title":"L", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4ubg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4ubg", + "urlId":"UmFkaW9CcmVtZW4ubg", + "title":"N", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ubg?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"N", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4ubg", + "widget_title":"N", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4ucA", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":4 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4ucA", + "urlId":"UmFkaW9CcmVtZW4ucA", + "title":"P", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ucA?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"P", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4ucA", + "widget_title":"P", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4ucg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4ucg", + "urlId":"UmFkaW9CcmVtZW4ucg", + "title":"R", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ucg?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"R", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4ucg", + "widget_title":"R", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4udA", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4udA", + "urlId":"UmFkaW9CcmVtZW4udA", + "title":"T", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udA?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"T", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4udA", + "widget_title":"T", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4udQ", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":2 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4udQ", + "urlId":"UmFkaW9CcmVtZW4udQ", + "title":"U", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udQ?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"U", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4udQ", + "widget_title":"U", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4udg", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4udg", + "urlId":"UmFkaW9CcmVtZW4udg", + "title":"V", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udg?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"V", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4udg", + "widget_title":"V", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4udw", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":3 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4udw", + "urlId":"UmFkaW9CcmVtZW4udw", + "title":"W", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4udw?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"W", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4udw", + "widget_title":"W", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4ueQ", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":1 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4ueQ", + "urlId":"UmFkaW9CcmVtZW4ueQ", + "title":"Y", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4ueQ?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"Y", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4ueQ", + "widget_title":"Y", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + }, + { + "aZContent":true, + "compilationType":"editorial", + "id":"UmFkaW9CcmVtZW4uIw", + "isChildContent":false, + "pagination":{ + "pageNumber":0, + "pageSize":100, + "totalElements":3 + }, + "personalized":false, + "links":{ + "self":{ + "id":"UmFkaW9CcmVtZW4uIw", + "urlId":"UmFkaW9CcmVtZW4uIw", + "title":"#", + "href":"https://api.ardmediathek.de/page-gateway/widgets/radiobremen/editorials/UmFkaW9CcmVtZW4uIw?pageNumber=0&pageSize=100&embedded=false", + "type":"application/vnd.ard.widget+json", + "partner":"radiobremen" + } + }, + "size":"m", + "swipeable":true, + "teasers":[ + + ], + "title":"#", + "titleVisible":true, + "trackingPiano":{ + "teaser_recommended":false, + "widget_id":"UmFkaW9CcmVtZW4uIw", + "widget_title":"#", + "widget_typ":"gridlist" + }, + "type":"gridlist", + "userVisibility":"ALWAYS" + } + ] +}