diff --git a/src/main/java/de/mediathekview/mserver/base/utils/JsonUtils.java b/src/main/java/de/mediathekview/mserver/base/utils/JsonUtils.java index 9a1e02390..30deb2aa8 100644 --- a/src/main/java/de/mediathekview/mserver/base/utils/JsonUtils.java +++ b/src/main/java/de/mediathekview/mserver/base/utils/JsonUtils.java @@ -65,6 +65,17 @@ public static Optional getAttributeAsString( return Optional.empty(); } + public static Optional getAttributeAsInt(final JsonObject jsonObject, final String attributeName) { + if (jsonObject.has(attributeName)) { + final JsonElement aElement = jsonObject.get(attributeName); + if (!aElement.isJsonNull()) { + return Optional.of(aElement.getAsInt()); + } + } + + return Optional.empty(); + } + public static Optional getElementValueAsString(final JsonElement aJsonElement, final String... aElementIds) { Optional rs = Optional.empty(); JsonObject aJsonObject = aJsonElement.getAsJsonObject(); diff --git a/src/main/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizer.java b/src/main/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizer.java index 8496b7d9b..50a71acd1 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizer.java @@ -32,17 +32,22 @@ public class ZdfVideoUrlOptimizer { private static final String NORMAL_2360_35_17 = "2360k_p35v17.mp4"; private static final String HD_3256 = "3256k_p15v12.mp4"; - private static final String HD_3296 = "3296k_p15v13.mp4"; + private static final String HD_3296_15_13 = "3296k_p15v13.mp4"; + private static final String HD_3296_15_14 = "3296k_p15v14.mp4"; + private static final String HD_3328_15_15 = "3328k_p15v15.mp4"; private static final String HD_3328_12 = "3328k_p36v12.mp4"; private static final String HD_3328_13 = "3328k_p36v13.mp4"; private static final String HD_3328_14 = "3328k_p36v14.mp4"; private static final String HD_3328_35_14 = "3328k_p35v14.mp4"; + private static final String HD_3328_36_13 = "3328k_p36v13.mp4"; + private static final String HD_3328_36_14 = "3328k_p36v14.mp4"; private static final String HD_3360_36_15 = "3360k_p36v15.mp4"; private static final String HD_3360_36_17 = "3360k_p36v17.mp4"; private static final String HD_6628_61_17 = "6628k_p61v17.mp4"; private static final String HD_6660_37_17 = "6660k_p37v17.mp4"; private static final Map NORMAL_OPTIMIZE = new HashMap<>(); + private static final Map NORMAL_TO_HD = new HashMap<>(); private static final Map HD_OPTIMIZE = new HashMap<>(); static { @@ -57,20 +62,26 @@ public class ZdfVideoUrlOptimizer { NORMAL_OPTIMIZE.put(NORMAL_1496_13_14, new String[] {NORMAL_2328_35_14, NORMAL_2296_14_14}); NORMAL_OPTIMIZE.put(NORMAL_1628_13_15, new String[] {NORMAL_2360_35_15}); - - HD_OPTIMIZE.put(NORMAL_2360_35_17, new String[] {HD_6660_37_17, HD_6628_61_17, HD_3360_36_17}); - HD_OPTIMIZE.put(NORMAL_1628_13_17, new String[] {HD_6660_37_17, HD_6628_61_17, HD_3360_36_17}); - HD_OPTIMIZE.put(NORMAL_1456_13_12, new String[] {HD_3328_12, HD_3256}); - HD_OPTIMIZE.put(NORMAL_2256_14_12, new String[] {HD_3328_12, HD_3256}); - HD_OPTIMIZE.put(NORMAL_2328_35_12, new String[] {HD_3328_12, HD_3256}); - HD_OPTIMIZE.put(NORMAL_1496_13_13, new String[] {HD_3328_13, HD_3296}); - HD_OPTIMIZE.put(NORMAL_2296_14_13, new String[] {HD_3328_13, HD_3296}); - HD_OPTIMIZE.put(NORMAL_2328_35_13, new String[] {HD_3328_13, HD_3296}); - HD_OPTIMIZE.put(NORMAL_1496_13_14, new String[] {HD_3328_14, HD_3328_35_14}); - HD_OPTIMIZE.put(NORMAL_2296_14_14, new String[] {HD_3328_14, HD_3328_35_14}); - HD_OPTIMIZE.put(NORMAL_2328_35_14, new String[] {HD_3328_14, HD_3328_35_14}); - HD_OPTIMIZE.put(NORMAL_1628_13_15, new String[] {HD_3360_36_15}); - HD_OPTIMIZE.put(NORMAL_2360_35_15, new String[] {HD_3360_36_15}); + NORMAL_TO_HD.put(NORMAL_2360_35_17, new String[] {HD_6660_37_17, HD_6628_61_17, HD_3360_36_17}); + NORMAL_TO_HD.put(NORMAL_1628_13_17, new String[] {HD_6660_37_17, HD_6628_61_17, HD_3360_36_17}); + NORMAL_TO_HD.put(NORMAL_1456_13_12, new String[] {HD_3328_12, HD_3256}); + NORMAL_TO_HD.put(NORMAL_2256_14_12, new String[] {HD_3328_12, HD_3256}); + NORMAL_TO_HD.put(NORMAL_2328_35_12, new String[] {HD_3328_12, HD_3256}); + NORMAL_TO_HD.put(NORMAL_1496_13_13, new String[] {HD_3328_13, HD_3296_15_14, HD_3296_15_13}); + NORMAL_TO_HD.put(NORMAL_2296_14_13, new String[] {HD_3328_13, HD_3296_15_14, HD_3296_15_13}); + NORMAL_TO_HD.put(NORMAL_2328_35_13, new String[] {HD_3328_13, HD_3296_15_14, HD_3296_15_13}); + NORMAL_TO_HD.put(NORMAL_1496_13_14, new String[] {HD_3328_14, HD_3328_35_14}); + NORMAL_TO_HD.put(NORMAL_2296_14_14, new String[] {HD_3328_14, HD_3328_35_14}); + NORMAL_TO_HD.put(NORMAL_2328_35_14, new String[] {HD_3328_14, HD_3328_35_14}); + NORMAL_TO_HD.put(NORMAL_1628_13_15, new String[] {HD_3360_36_15}); + NORMAL_TO_HD.put(NORMAL_2360_35_15, new String[] {HD_3360_36_15}); + + HD_OPTIMIZE.put(HD_3360_36_17, new String[] {HD_6660_37_17, HD_6628_61_17}); + HD_OPTIMIZE.put(HD_6628_61_17, new String[] {HD_6660_37_17}); + HD_OPTIMIZE.put(HD_3328_15_15, new String[] {HD_3360_36_15}); + HD_OPTIMIZE.put(HD_3256, new String[] {HD_3328_12}); + HD_OPTIMIZE.put(HD_3296_15_14, new String[] {HD_3328_36_14}); + HD_OPTIMIZE.put(HD_3296_15_13, new String[] {HD_3328_36_13}); } protected AbstractCrawler crawler; @@ -89,6 +100,15 @@ public String getOptimizedUrlNormal(final String aUrl) { return optimize(aUrl, NORMAL_OPTIMIZE); } + /** + * optimizes the hd url + * @param aUrl the hd url + * @return the optimized hd url + */ + public String getOptimizedUrlHd(final String aUrl) { + return optimize(aUrl, HD_OPTIMIZE); + } + /** * tries to find the hd url depending on the normal url. * @@ -100,7 +120,7 @@ public Optional determineUrlHd(final String aNormalUrl) { return Optional.empty(); } - final String url = optimize(aNormalUrl, HD_OPTIMIZE); + final String url = optimize(aNormalUrl, NORMAL_TO_HD); if (url.equalsIgnoreCase(aNormalUrl)) { return Optional.empty(); } diff --git a/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializer.java index db7c82afe..6e606679d 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializer.java @@ -1,25 +1,26 @@ package de.mediathekview.mserver.crawler.zdf.json; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; +import com.google.gson.*; import de.mediathekview.mlib.daten.GeoLocations; import de.mediathekview.mlib.daten.Resolution; -import java.lang.reflect.Type; -import java.time.Duration; -import java.util.Iterator; -import java.util.Optional; +import de.mediathekview.mserver.base.utils.JsonUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.lang.reflect.Type; +import java.time.Duration; +import java.util.*; + /** A JSON deserializer to gather the needed information for a {@link DownloadDto}. */ public class ZdfDownloadDtoDeserializer implements JsonDeserializer> { + private static final String ZDF_QUALITY_UHD = "uhd"; + private static final String ZDF_QUALITY_FHD = "fhd"; + private static final String ZDF_QUALITY_HD = "hd"; private static final String ZDF_QUALITY_VERYHIGH = "veryhigh"; private static final String ZDF_QUALITY_HIGH = "high"; private static final String ZDF_QUALITY_MED = "med"; + private static final String ZDF_QUALITY_MEDIUM = "medium"; private static final String ZDF_QUALITY_LOW = "low"; private static final Logger LOG = LogManager.getLogger(ZdfDownloadDtoDeserializer.class); private static final String JSON_ELEMENT_ATTRIBUTES = "attributes"; @@ -29,7 +30,7 @@ public class ZdfDownloadDtoDeserializer implements JsonDeserializer extractTrack( + JsonElement aTrackElement) { + JsonObject trackObject = aTrackElement.getAsJsonObject(); + String classValue = trackObject.get(JSON_ELEMENT_CLASS).getAsString(); + String language = trackObject.get(JSON_ELEMENT_LANGUAGE).getAsString(); + String uri = trackObject.get(JSON_ELEMENT_URI).getAsString(); + + // films with audiodescription are handled as a language + if (CLASS_AD.equalsIgnoreCase(classValue)) { + language += "-ad"; + } + if (uri != null) { + return new AbstractMap.SimpleEntry<>(language, uri); + } else { + throw new RuntimeException("uri is null"); + } + } + @Override public Optional deserialize( final JsonElement aJsonElement, @@ -73,7 +92,8 @@ private void parseDuration(final DownloadDto dto, final JsonObject rootNode) { if (attributes != null) { final JsonElement durationElement = attributes.getAsJsonObject().get(JSON_ELEMENT_DURATION); if (durationElement != null) { - final JsonElement durationValue = durationElement.getAsJsonObject().get(JSON_PROPERTY_VALUE); + final JsonElement durationValue = + durationElement.getAsJsonObject().get(JSON_PROPERTY_VALUE); if (durationValue != null) { dto.setDuration(Duration.ofMillis(durationValue.getAsLong())); } @@ -86,13 +106,15 @@ private void parseFormitaet(final DownloadDto dto, final JsonElement formitaet) final JsonElement mimeType = formitaet.getAsJsonObject().get(JSON_ELEMENT_MIMETYPE); if (mimeType != null && mimeType.getAsString().equalsIgnoreCase(RELEVANT_MIME_TYPE)) { + List downloads = new ArrayList<>(); + // array Resolution final JsonArray qualityList = formitaet.getAsJsonObject().getAsJsonArray(JSON_ELEMENT_QUALITIES); for (final JsonElement quality : qualityList) { - final Resolution qualityValue = parseVideoQuality(quality.getAsJsonObject()); - + final Resolution resolution = parseVideoQuality(quality.getAsJsonObject()); + final Optional verticalResolution = JsonUtils.getAttributeAsInt(quality.getAsJsonObject(), JSON_ELEMENT_HIGHEST_VERTIVAL_RESOLUTION); // subelement audio final JsonElement audio = quality.getAsJsonObject().get(JSON_ELEMENT_AUDIO); if (audio != null) { @@ -101,28 +123,14 @@ private void parseFormitaet(final DownloadDto dto, final JsonElement formitaet) final JsonArray tracks = audio.getAsJsonObject().getAsJsonArray(JSON_ELEMENT_TRACKS); for (JsonElement trackElement : tracks) { - extractTrack(dto, qualityValue, trackElement); + final AbstractMap.SimpleEntry languageUri = extractTrack(trackElement); + downloads.add(new DownloadInfo(languageUri.getKey(), languageUri.getValue(), verticalResolution.orElse(0), resolution)); } } } - } - } - - private static void extractTrack( - DownloadDto aDto, Resolution aQualityValue, JsonElement aTrackElement) { - JsonObject trackObject = aTrackElement.getAsJsonObject(); - String classValue = trackObject.get(JSON_ELEMENT_CLASS).getAsString(); - String language = trackObject.get(JSON_ELEMENT_LANGUAGE).getAsString(); - String uri = trackObject.get(JSON_ELEMENT_URI).getAsString(); - // films with audiodescription are handled as a language - if (CLASS_AD.equalsIgnoreCase(classValue)) { - language += "-ad"; - } - if (aQualityValue != null && uri != null) { - aDto.addUrl(language, aQualityValue, uri); - } else { - throw new RuntimeException("either quality or uri is null"); + downloads.sort(Comparator.comparingInt(DownloadInfo::verticalResolution)); + downloads.forEach(info -> dto.addUrl(info.language(), info.resolution(), info.uri())); } } @@ -137,7 +145,7 @@ private void parseGeoLocation(final DownloadDto dto, final JsonObject rootNode) if (foundGeoLocation.isPresent()) { dto.setGeoLocation(foundGeoLocation.get()); } else { - LOG.debug(String.format("Can't find a GeoLocation for \"%s", geoValue.getAsString())); + LOG.debug("Can't find a GeoLocation for {}", geoValue.getAsString()); } } } @@ -180,27 +188,27 @@ private void parseSubtitle(final DownloadDto dto, final JsonObject rootNode) { private Resolution parseVideoQuality(final JsonObject quality) { Resolution qualityValue; - final JsonElement hd = quality.get(JSON_ELEMENT_HD); - if (hd != null && hd.getAsBoolean()) { - qualityValue = Resolution.HD; - } else { - final String zdfQuality = quality.get(JSON_ELEMENT_QUALITY).getAsString(); - switch (zdfQuality) { - case ZDF_QUALITY_LOW: - qualityValue = Resolution.SMALL; - break; - case ZDF_QUALITY_MED: - qualityValue = Resolution.SMALL; - break; - case ZDF_QUALITY_HIGH: - qualityValue = Resolution.SMALL; - break; - case ZDF_QUALITY_VERYHIGH: - qualityValue = Resolution.NORMAL; - break; - default: - qualityValue = Resolution.VERY_SMALL; - } + final String zdfQuality = quality.get(JSON_ELEMENT_QUALITY).getAsString(); + switch (zdfQuality) { + case ZDF_QUALITY_LOW: + case ZDF_QUALITY_MED: + case ZDF_QUALITY_MEDIUM: + case ZDF_QUALITY_HIGH: + qualityValue = Resolution.SMALL; + break; + case ZDF_QUALITY_VERYHIGH: + qualityValue = Resolution.NORMAL; + break; + case ZDF_QUALITY_HD: + case ZDF_QUALITY_FHD: + qualityValue = Resolution.HD; + break; + case ZDF_QUALITY_UHD: + qualityValue = Resolution.UHD; + break; + default: + LOG.error("unknown quality: {}", zdfQuality); + qualityValue = Resolution.VERY_SMALL; } return qualityValue; } @@ -213,4 +221,7 @@ private void parseVideoUrls(final DownloadDto dto, final JsonObject rootNode) { parsePriority(dto, priority); } } + + private record DownloadInfo(String language, String uri, int verticalResolution, Resolution resolution) { + } } diff --git a/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializer.java index 4b6fdd517..d8220f136 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializer.java +++ b/src/main/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializer.java @@ -46,7 +46,7 @@ public class ZdfFilmDetailDeserializer implements JsonDeserializer getOptimizedUrls(Map urls) if (qualitiesEntry.getKey() == Resolution.NORMAL) { url = optimizer.getOptimizedUrlNormal(url); + } else if (qualitiesEntry.getKey() == Resolution.HD) { + url = optimizer.getOptimizedUrlHd(url); } result.put(qualitiesEntry.getKey(), new FilmUrl(url, crawler.determineFileSizeInKB(url))); diff --git a/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java index e3212b0b4..0a6362349 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/phoenix/tasks/PhoenixFilmDetailTaskTest.java @@ -92,7 +92,7 @@ public static Collection data() { "/phoenix/phoenix_film_detail2_reponse.json", "/php/mediaplayer/data/beitrags_details.php?id=2121010", "/phoenix/phoenix_film_detail2_beitrag_details.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/phoenix/210416_phx_doku_awri_2", + "/tmd/2/android_native_5/vod/ptmd/phoenix/210416_phx_doku_awri_2", "/phoenix/phoenix_film_detail2_video.json", "Alles was Recht ist", "(2/5): Persönlichkeit oder Öffentlichkeit?", @@ -111,7 +111,7 @@ public static Collection data() { "/phoenix/phoenix_film_detail3_response.json", "/php/mediaplayer/data/beitrags_details.php?id=2361354", "/phoenix/phoenix_film_detail3_beitrag_details.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/phoenix/211114_1200_phx_presseclub", + "/tmd/2/android_native_5/vod/ptmd/phoenix/211114_1200_phx_presseclub", "/phoenix/phoenix_film_detail3_video.json", "Presseclub", "Handeln statt Reden: Impfpflicht für alle?", diff --git a/src/test/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizerTest.java b/src/test/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizerTest.java index a31efeba7..c128c67ec 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/zdf/ZdfVideoUrlOptimizerTest.java @@ -57,6 +57,39 @@ public void getOptimizedUrlNormalTestBetterUrlNotExists() { assertGetOptimizedUrlNormal(url, url); } + @Test + public void getOptimizedUrlHdTestAlreadyBestQuality() { + final String url = getWireMockBaseUrlSafe() + "/video_6660k_p37v17.mp4"; + + assertGetOptimizedUrlHd(url, url); + } + + @Test + public void getOptimizedUrlHdTestBetterUrlExists() { + final String url = getWireMockBaseUrlSafe() + "/video_3360k_p36v17.mp4"; + final String expectedUrl = getWireMockBaseUrlSafe() + "/video_6660k_p37v17.mp4"; + + setupHeadResponse("/video_6660k_p37v17.mp4", 200); + assertGetOptimizedUrlHd(expectedUrl, url); + } + + @Test + public void getOptimizedUrlHdTestBetterUrlExists2() { + final String url = getWireMockBaseUrlSafe() + "/video_3360k_p36v17.mp4"; + final String expectedUrl = getWireMockBaseUrlSafe() + "/video_6628k_p61v17.mp4"; + + setupHeadResponse("/video_6628k_p61v17.mp4", 200); + assertGetOptimizedUrlHd(expectedUrl, url); + } + + @Test + public void getOptimizedUrlHdTestBetterUrlNotExists() { + final String url = getWireMockBaseUrlSafe() + "/video_3360k_p36v17.mp4"; + + setupHeadResponse("/video_6660k_p37v17.mp4", 404); + assertGetOptimizedUrlHd(url, url); + } + @Test public void determineUrlHdTestFirstUrlExists() { final String url = getWireMockBaseUrlSafe() + "/video_1456k_p13v12.mp4"; @@ -125,6 +158,11 @@ private void assertGetOptimizedUrlNormal(final String aExpectedUrl, final String assertThat(actual, equalTo(aExpectedUrl)); } + private void assertGetOptimizedUrlHd(final String aExpectedUrl, final String aUrlToCheck) { + final String actual = target.getOptimizedUrlHd(aUrlToCheck); + assertThat(actual, equalTo(aExpectedUrl)); + } + private void assertDetermineUrlHd(final Optional aExpectedUrl, final String aUrlToCheck) { final Optional actual = target.determineUrlHd(aUrlToCheck); assertThat(actual, equalTo(aExpectedUrl)); diff --git a/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializerTest.java index 06258875c..8cef7de95 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfDownloadDtoDeserializerTest.java @@ -1,22 +1,23 @@ package de.mediathekview.mserver.crawler.zdf.json; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; - import com.google.gson.JsonObject; import de.mediathekview.mlib.daten.GeoLocations; import de.mediathekview.mlib.daten.Resolution; import de.mediathekview.mserver.crawler.zdf.ZdfConstants; import de.mediathekview.mserver.testhelper.AssertFilm; import de.mediathekview.mserver.testhelper.JsonFileReader; -import java.util.Arrays; -import java.util.Collection; -import java.util.Optional; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import java.util.Arrays; +import java.util.Collection; +import java.util.Optional; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + @RunWith(Parameterized.class) public class ZdfDownloadDtoDeserializerTest { @@ -24,12 +25,15 @@ public class ZdfDownloadDtoDeserializerTest { private final String expectedUrlSmall; private final String expectedUrlNormal; private final String expectedUrlHd; + private final String expectedUrlUhd; private final String expectedUrlSmallEnglish; private final String expectedUrlNormalEnglish; private final String expectedUrlHdEnglish; + private final String expectedUrlUhdEnglish; private final String expectedUrlSmallAd; private final String expectedUrlNormalAd; private final String expectedUrlHdAd; + private final String expectedUrlUhdAd; private final Optional expectedSubtitle; private final Optional expectedGeo; @@ -38,24 +42,30 @@ public ZdfDownloadDtoDeserializerTest( final String aExpectedUrlSmall, final String aExpectedUrlNormal, final String aExpectedUrlHd, + final String aExpectedUrlUhd, final String aExpectedUrlSmallEnglish, final String aExpectedUrlNormalEnglish, final String aExpectedUrlHdEnglish, + final String aExpectedUrlUhdEnglish, final String aExpectedUrlSmallAd, final String aExpectedUrlNormalAd, final String aExpectedUrlHdAd, + final String aExpectedUrlUhdAd, final Optional aExpectedSubtitle, final Optional aExpectedGeo) { jsonFile = aJsonFile; expectedUrlSmall = aExpectedUrlSmall; expectedUrlNormal = aExpectedUrlNormal; expectedUrlHd = aExpectedUrlHd; + expectedUrlUhd = aExpectedUrlUhd; expectedUrlSmallEnglish = aExpectedUrlSmallEnglish; expectedUrlNormalEnglish = aExpectedUrlNormalEnglish; expectedUrlHdEnglish = aExpectedUrlHdEnglish; + expectedUrlUhdEnglish = aExpectedUrlUhdEnglish; this.expectedUrlSmallAd = aExpectedUrlSmallAd; this.expectedUrlNormalAd = aExpectedUrlNormalAd; this.expectedUrlHdAd = aExpectedUrlHdAd; + this.expectedUrlUhdAd = aExpectedUrlUhdAd; expectedSubtitle = aExpectedSubtitle; expectedGeo = aExpectedGeo; } @@ -75,6 +85,9 @@ public static Collection data() { "", "", "", + "", + "", + "", Optional.empty(), Optional.of(GeoLocations.GEO_NONE) }, @@ -89,6 +102,9 @@ public static Collection data() { "", "", "", + "", + "", + "", Optional.of("https://utstreaming.zdf.de/mtt/zdf/18/03/180302_fr_lot/2/logo_020318.xml"), Optional.of(GeoLocations.GEO_DE_AT_CH_EU) }, @@ -103,6 +119,9 @@ public static Collection data() { "", "", "", + "", + "", + "", Optional.empty(), Optional.of(GeoLocations.GEO_DE_AT_CH) }, @@ -111,12 +130,15 @@ public static Collection data() { "http://localhost:8589/de/zdf/18/04/180416_2215_sendung_hsn/7/180416_2215_sendung_hsn_a1a2_476k_p9v13.mp4", "http://localhost:8589/de/zdf/18/04/180416_2215_sendung_hsn/7/180416_2215_sendung_hsn_a1a2_1496k_p13v13.mp4", "", + "", "http://localhost:8589/de/zdf/18/04/180416_2215_sendung_hsn/7/180416_2215_sendung_hsn_a3a4_476k_p9v13.mp4", "http://localhost:8589/de/zdf/18/04/180416_2215_sendung_hsn/7/180416_2215_sendung_hsn_a3a4_1496k_p13v13.mp4", "", "", "", "", + "", + "", Optional.of( "https://utstreaming.zdf.de/mtt/zdf/18/04/180416_2215_sendung_hsn/7/Hard_Sun_Teil1_OmU.xml"), Optional.of(GeoLocations.GEO_DE) @@ -132,6 +154,9 @@ public static Collection data() { "", "", "", + "", + "", + "", Optional.empty(), Optional.of(GeoLocations.GEO_NONE) }, @@ -143,12 +168,50 @@ public static Collection data() { "", "", "", + "", + "", "http://localhost:8589/de/zdf/19/07/190715_schatz_nimm_du_sie_mok/4/190715_schatz_nimm_du_sie_mok_a3a4_776k_p11v14.mp4", "http://localhost:8589/de/zdf/19/07/190715_schatz_nimm_du_sie_mok/4/190715_schatz_nimm_du_sie_mok_a3a4_1496k_p13v14.mp4", "", + "", Optional.of( "https://utstreaming.zdf.de/mtt/zdf/19/07/190715_schatz_nimm_du_sie_mok/4/F1021200_hoh_deu_Schatz_nimm_du_sie_150719.xml"), Optional.of(GeoLocations.GEO_DE) + }, + { + "/zdf/zdf_video_details_uhd.json", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_808k_p11v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_1628k_p13v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_3328k_p15v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_4692k_p72v16.mp4", + "", + "", + "", + "", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_808k_p11v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_1628k_p13v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_3328k_p15v15.mp4", + "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_4692k_p72v16.mp4", + Optional.of( + "https://utstreaming.zdf.de/mtt/zdf/23/01/230101_2015_sendung_trs/6/F1037067_hoh_deu_Das_Traumschiff_Bahamas_Karibik_final_010123.xml"), + Optional.of(GeoLocations.GEO_NONE) + }, + { + "/zdf/zdf_video_details_fhd.json", + "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_808k_p11v17.mp4", + "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_1628k_p13v17.mp4", + "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_6628k_p61v17.mp4", + "", + "", + "", + "", + "", + "", + "", + "", + "", + Optional.empty(), + Optional.of(GeoLocations.GEO_DE_AT_CH) } }); } @@ -170,18 +233,23 @@ public void test() { AssertFilm.assertUrl( expectedUrlNormal, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN, Resolution.NORMAL)); AssertFilm.assertUrl(expectedUrlHd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN, Resolution.HD)); + AssertFilm.assertUrl(expectedUrlUhd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN, Resolution.UHD)); AssertFilm.assertUrl( expectedUrlSmallEnglish, dto.getUrl(ZdfConstants.LANGUAGE_ENGLISH, Resolution.SMALL)); AssertFilm.assertUrl( expectedUrlNormalEnglish, dto.getUrl(ZdfConstants.LANGUAGE_ENGLISH, Resolution.NORMAL)); AssertFilm.assertUrl( expectedUrlHdEnglish, dto.getUrl(ZdfConstants.LANGUAGE_ENGLISH, Resolution.HD)); + AssertFilm.assertUrl( + expectedUrlUhdEnglish, dto.getUrl(ZdfConstants.LANGUAGE_ENGLISH, Resolution.UHD)); AssertFilm.assertUrl( expectedUrlSmallAd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN_AD, Resolution.SMALL)); AssertFilm.assertUrl( expectedUrlNormalAd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN_AD, Resolution.NORMAL)); AssertFilm.assertUrl( expectedUrlHdAd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN_AD, Resolution.HD)); + AssertFilm.assertUrl( + expectedUrlUhdAd, dto.getUrl(ZdfConstants.LANGUAGE_GERMAN_AD, Resolution.UHD)); assertThat(dto.getSubTitleUrl(), equalTo(expectedSubtitle)); assertThat(dto.getGeoLocation(), equalTo(expectedGeo)); } diff --git a/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializerTest.java b/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializerTest.java index 04e137d31..3814450fe 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/zdf/json/ZdfFilmDetailDeserializerTest.java @@ -71,7 +71,7 @@ public static Collection data() { Duration.ofHours(1).plusMinutes(27).plusSeconds(35), "Der Mord an Studienrat Lampert führt \"Das Duo\" an eine Schule, an der Täter und Opfer sich vermutlich begegnet sind. In deren Umfeld suchen Clara Hertz und Marion Ahrens auch das Motiv.", "https://www.zdf.de/filme/das-duo/das-duo-echte-kerle-102.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/160605_echte_kerle_das_duo_neo", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/160605_echte_kerle_das_duo_neo", Optional.empty() }, { @@ -83,7 +83,7 @@ public static Collection data() { Duration.ofMinutes(8).plusSeconds(14), "Schaut euch hier die logo!-Sendung von Freitagabend noch einmal an! Die Sendungen sind eine Woche online.", "https://www.zdf.de/kinder/logo/logo-am-freitagabend-104.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/180302_fr_lot", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/180302_fr_lot", Optional.empty() }, { @@ -95,7 +95,7 @@ public static Collection data() { Duration.ofMinutes(24).plusSeconds(55), "Naya verliert beim Seiltanz ihre Glücksblume und alles geht schief. Kann ein anderer Glücksbringer helfen? Glühwürmchen Minou hat eine \"leuchtende\" Idee.", "https://www.zdf.de/kinder/jonalu/tanz-auf-dem-seil-102.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/tivi/160301_folge25_tanzaufdemseil_jon", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/tivi/160301_folge25_tanzaufdemseil_jon", Optional.empty() }, { @@ -107,7 +107,7 @@ public static Collection data() { Duration.ofMinutes(2).plusSeconds(34), "Die diesjährigen Oscar-Gewinner stehen schon fest. Denn die rund 8000 Juroren haben ihre Stimmzettel längst eingereicht. Am Sonntag werden die Oscars zum 90. Mal vergeben - und dann kennen auch wir die Gewinner.", "https://www.zdf.de/nachrichten/zdf-morgenmagazin/videos/oscars-106.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/180302_clip_12_mom", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/180302_clip_12_mom", Optional.empty() }, { @@ -119,7 +119,7 @@ public static Collection data() { Duration.ofMinutes(2).plusSeconds(37), "Mit Werken wie \"Der Besuch des Leibarztes\" gehörte er zu den bekanntesten Schrifstellern Schwedens. Jetzt ist Per Olov Enquist im Alter von 85 Jahren gestorben.", "https://www.3sat.de/kultur/kulturzeit/nachruf-auf-per-olov-enquist-100.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/3sat/200427_enquist_kuz", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/3sat/200427_enquist_kuz", Optional.empty() }, { @@ -131,7 +131,7 @@ public static Collection data() { Duration.ofSeconds(43), "Im römischen Reich wurden entscheidende Grundsteine der Rechtsprechung gelegt. Prozesse im alten Rom liefen ähnlich ab wie heute.", "https://www.zdf.de/dokumentation/terra-x/rechtswesen-im-antiken-rom-creative-commons-100.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/200428_132_0055303728_Rechtswesen_Antikes_Rom_CC_tex", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/200428_132_0055303728_Rechtswesen_Antikes_Rom_CC_tex", Optional.empty() }, { @@ -143,7 +143,7 @@ public static Collection data() { Duration.ofMinutes(54), "Ludwig van Beethoven wurde im Dezember 1770 geboren. Zu Lebzeiten schon gefeierter Virtuose und Komponist, sprachen seine Werke eine zuvor nie gehörte Klangsprache. Heutzutage gilt er als derjenige, der die Wiener Klassik zur Vollendung brachte.", "https://www.zdf.de/kultur/musik-und-theater/great-composers-beethoven-100.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/201201_composerbeethoven_kul", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/201201_composerbeethoven_kul", Optional.empty() }, { @@ -155,9 +155,9 @@ public static Collection data() { Duration.ofMinutes(44).plusSeconds(24), "Trotz aller Bemühung um Inklusion erleben Menschen mit Behinderungen in Deutschland immer noch täglich Ablehnung und Ausgrenzung. Warum ist das so? Und war das schon immer so?", "https://www.zdf.de/dokumentation/zdfinfo-doku/geliebt-geduldet-getoetet-die-geschichte-von-menschen-mit-behinderungen-100.html", - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf/4", + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf/4", Optional.of( - "https://api.zdf.de/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf_dgs/2") + "https://api.zdf.de/tmd/2/android_native_5/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf_dgs/2") } }); } diff --git a/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskMultipleLanguagesTest.java b/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskMultipleLanguagesTest.java index 15abf69db..3084efcbb 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskMultipleLanguagesTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskMultipleLanguagesTest.java @@ -40,7 +40,7 @@ public void testGermanAndEnglish() { }; final String filmUrl = "/content/documents/zdf/serien/hardsun/hard-sun-1-100.json"; - final String videoUrl = "/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/180416_2215_sendung_hsn"; + final String videoUrl = "/tmd/2/android_native_5/vod/ptmd/mediathek/180416_2215_sendung_hsn"; setupSuccessfulJsonResponse(filmUrl, "/zdf/zdf_film_details_english.json"); setupSuccessfulJsonResponse(videoUrl, "/zdf/zdf_video_details_english.json"); diff --git a/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskTest.java index 9e1afa0af..54177037c 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/zdf/tasks/ZdfFilmDetailTaskTest.java @@ -107,7 +107,7 @@ public static Collection data() { { "/content/documents/zdf/filme/das-duo/das-duo-echte-kerle-102.json", "/zdf/zdf_film_details1.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/160605_echte_kerle_das_duo_neo", + "/tmd/2/android_native_5/vod/ptmd/mediathek/160605_echte_kerle_das_duo_neo", "/zdf/zdf_video_details1.json", "", "", @@ -133,7 +133,7 @@ public static Collection data() { { "/content/documents/zdf/kinder/jonalu/tanz-auf-dem-seil-102.json", "/zdf/zdf_film_details3.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/tivi/160301_folge25_tanzaufdemseil_jon", + "/tmd/2/android_native_5/vod/ptmd/tivi/160301_folge25_tanzaufdemseil_jon", "/zdf/zdf_video_details3.json", "", "", @@ -159,7 +159,7 @@ public static Collection data() { { "/content/documents/zdf/filme/montagskino/schatz-nimm-du-sie-100.json", "/zdf/zdf_film_details_with_audiodescription.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/190715_schatz_nimm_du_sie_mok", + "/tmd/2/android_native_5/vod/ptmd/mediathek/190715_schatz_nimm_du_sie_mok", "/zdf/zdf_video_details_with_audiodescription.json", "", "", @@ -185,9 +185,9 @@ public static Collection data() { { "/content/documents/zdf/dokumentation/zdfinfo-doku/leben-auf-der-strasse-obdachlos-und-abgehaengt-100.json", "/zdf/zdf_film_details_with_dgs.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf/4", + "/tmd/2/android_native_5/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf/4", "/zdf/zdf_video_details_with_dgs_default.json", - "/tmd/2/ngplayer_2_3/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf_dgs/2", + "/tmd/2/android_native_5/vod/ptmd/mediathek/220505_geliebt_geduldet_getoetet_inf_dgs/2", "/zdf/zdf_video_details_with_dgs.json", "ZDFinfo Doku", "Geliebt, geduldet, getötet", diff --git a/src/test/resources/phoenix/phoenix_film_detail2_beitrag_details.json b/src/test/resources/phoenix/phoenix_film_detail2_beitrag_details.json index d6ee436e1..c9ea5c790 100644 --- a/src/test/resources/phoenix/phoenix_film_detail2_beitrag_details.json +++ b/src/test/resources/phoenix/phoenix_film_detail2_beitrag_details.json @@ -47,7 +47,7 @@ "visible":true, "visibleFrom":"2021-04-15T22:00:00.000Z", "visibleTo":"2021-10-15T22:00:00.000Z", - "http:\/\/zdf.de\/rels\/streams\/ptmd-template":"http:\/\/localhost:8589\/tmd\/2\/ngplayer_2_3\/vod\/ptmd\/phoenix\/210416_phx_doku_awri_2", + "http:\/\/zdf.de\/rels\/streams\/ptmd-template":"http:\/\/localhost:8589\/tmd\/2\/android_native_5\/vod\/ptmd\/phoenix\/210416_phx_doku_awri_2", "streamAnchorTag":[ ] diff --git a/src/test/resources/zdf/zdf_video_details_fhd.json b/src/test/resources/zdf/zdf_video_details_fhd.json new file mode 100644 index 000000000..0b75f7fc6 --- /dev/null +++ b/src/test/resources/zdf/zdf_video_details_fhd.json @@ -0,0 +1,409 @@ +{ + "attributes": { + "downloadAllowed": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": true + }, + "duration": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": 42000 + }, + "fsk": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": "none" + }, + "geoLocation": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": "dach" + }, + "profile": "http://zdf.de/rels/streams/ptmd/attributes" + }, + "basename": "201222_schwarm_meerestroemung_tex", + "captions": [], + "documentVersion": 2, + "mandant": "mediathek", + "playerId": "android_native_5", + "priorityList": [ + { + "formitaeten": [ + { + "facets": [ + "progressive" + ], + "isAdaptive": false, + "mimeType": "video/webm", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 25517750, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_4328k_p19v17.webm" + } + ] + }, + "hd": true, + "highestVerticalResolution": 1080, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "fhd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 12967728, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_2128k_p18v17.webm" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "hd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 5780089, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_1128k_p17v17.webm" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 2055269, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_368k_p16v17.webm" + } + ] + }, + "hd": false, + "highestVerticalResolution": 270, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + } + ], + "type": "vp9_opus_webm_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [], + "isAdaptive": true, + "mimeType": "application/x-mpegURL", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex,_508k_p9,_808k_p11,_1628k_p13,_3328k_p15,_6628k_p61,v17.mp4.csmil/master.m3u8" + } + ] + }, + "hd": true, + "highestVerticalResolution": 1080, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "auto" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex,_1628k_p13,_3328k_p15,_6628k_p61,v17.mp4.csmil/master.m3u8" + } + ] + }, + "hd": true, + "highestVerticalResolution": 1080, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex,_508k_p9,_808k_p11,_1628k_p13,_3328k_p15,_6628k_p61,v17.mp4.csmil/master.m3u8" + } + ] + }, + "hd": true, + "highestVerticalResolution": 1080, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex,_508k_p9,_808k_p11,_1628k_p13,v17.mp4.csmil/master.m3u8" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "med" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex,_508k_p9,_808k_p11,v17.mp4.csmil/master.m3u8" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "low" + } + ], + "type": "h264_aac_ts_http_m3u8_http" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [ + "progressive" + ], + "isAdaptive": false, + "mimeType": "video/mp4", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 21706380, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_6628k_p61v17.mp4" + } + ] + }, + "hd": true, + "highestVerticalResolution": 1080, + "mimeCodec": "avc1.64002a, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "fhd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 11033100, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_3328k_p15v17.mp4" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "mimeCodec": "avc1.640028, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "hd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 5670492, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_1628k_p13v17.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 2956483, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_808k_p11v17.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 1991129, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_508k_p9v17.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 270, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "low" + } + ], + "type": "h264_aac_mp4_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [ + "restriction_useragent" + ], + "isAdaptive": false, + "mimeType": "video/mp4", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 5670492, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_1628k_p13v17.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 2956483, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/dach/zdf/20/12/201222_schwarm_meerestroemung_tex/3/201222_schwarm_meerestroemung_tex_808k_p11v17.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + } + ], + "type": "h264_aac_mp4_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd", + "scrubPreview": { + "ImageInterval": "2000", + "ImageUrlScheme": "https://pvstreaming.zdf.de/dach/img/zdf/20/12/201222_schwarm_meerestroemung_tex/4/scrubpreview/201222_schwarm_meerestroemung_tex_%index%.jpg", + "ImagesPerColumn": "5", + "ImagesPerRow": "5" + }, + "self": "/tmd/2/android_native_5/vod/ptmd/mediathek/201222_schwarm_meerestroemung_tex/4", + "version": 4 +} \ No newline at end of file diff --git a/src/test/resources/zdf/zdf_video_details_uhd.json b/src/test/resources/zdf/zdf_video_details_uhd.json new file mode 100644 index 000000000..ef4a631bf --- /dev/null +++ b/src/test/resources/zdf/zdf_video_details_uhd.json @@ -0,0 +1,538 @@ +{ + "attributes": { + "downloadAllowed": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": true + }, + "duration": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": 5336000 + }, + "fsk": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": "none" + }, + "geoLocation": { + "profile": "http://zdf.de/rels/streams/ptmd/attributes/attribute", + "value": "none" + }, + "profile": "http://zdf.de/rels/streams/ptmd/attributes" + }, + "basename": "230101_2015_sendung_trs", + "captions": [ + { + "class": "hoh", + "format": "ebu-tt-d-basic-de", + "language": "deu", + "offset": 3000, + "profile": "http://zdf.de/rels/streams/ptmd/caption", + "uri": "https://utstreaming.zdf.de/mtt/zdf/23/01/230101_2015_sendung_trs/6/F1037067_hoh_deu_Das_Traumschiff_Bahamas_Karibik_final_010123.xml" + }, + { + "class": "hoh", + "format": "webvtt", + "language": "deu", + "offset": 3000, + "profile": "http://zdf.de/rels/streams/ptmd/caption", + "uri": "https://utstreaming.zdf.de/mtt/zdf/23/01/230101_2015_sendung_trs/6/F1037067_hoh_deu_Das_Traumschiff_Bahamas_Karibik_final_010123.vtt" + } + ], + "documentVersion": 2, + "mandant": "mediathek", + "playerId": "android_native_5", + "priorityList": [ + { + "formitaeten": [ + { + "facets": [ + "hdr_hlg", + "progressive" + ], + "isAdaptive": false, + "mimeType": "video/mp4", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 3017591313, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_4692k_p72v16.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 3017591313, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_4692k_p72v16.mp4" + } + ] + }, + "hd": true, + "highestVerticalResolution": 2160, + "mimeCodec": "hvc1.1.7.L120.b0, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "uhd" + } + ], + "type": "h265_aac_mp4_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [ + "progressive" + ], + "isAdaptive": false, + "mimeType": "video/webm", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 1785945383, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_2128k_p18v15.webm" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 1787159362, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_2128k_p18v15.webm" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "hd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 1035602365, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_1128k_p17v15.webm" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 1036816344, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_1128k_p17v15.webm" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 320074922, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_368k_p16v15.webm" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 321288901, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_368k_p16v15.webm" + } + ] + }, + "hd": false, + "highestVerticalResolution": 270, + "mimeCodec": "vp9, opus", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + } + ], + "type": "vp9_opus_webm_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [], + "isAdaptive": true, + "mimeType": "application/x-mpegURL", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a1a2_508k_p9,_a3a4_508k_p9,_a1a2_808k_p11,_a1a2_1628k_p13,_a1a2_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:TV%20Ton,1:deu:Audiodeskription" + }, + { + "cdn": "akamai", + "class": "ad", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a3a4_508k_p9,_a1a2_508k_p9,_a3a4_808k_p11,_a3a4_1628k_p13,_a3a4_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:Audiodeskription,1:deu:TV%20Ton" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "auto" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a1a2_1628k_p13,_a3a4_1628k_p13,_a1a2_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:TV%20Ton,1:deu:Audiodeskription" + }, + { + "cdn": "akamai", + "class": "ad", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a3a4_1628k_p13,_a1a2_1628k_p13,_a3a4_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:Audiodeskription,1:deu:TV%20Ton" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a1a2_508k_p9,_a3a4_508k_p9,_a1a2_808k_p11,_a1a2_1628k_p13,_a1a2_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:TV%20Ton,1:deu:Audiodeskription" + }, + { + "cdn": "akamai", + "class": "ad", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a3a4_508k_p9,_a1a2_508k_p9,_a3a4_808k_p11,_a3a4_1628k_p13,_a3a4_3328k_p15,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:Audiodeskription,1:deu:TV%20Ton" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a1a2_508k_p9,_a3a4_508k_p9,_a1a2_808k_p11,_a1a2_1628k_p13,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:TV%20Ton,1:deu:Audiodeskription" + }, + { + "cdn": "akamai", + "class": "ad", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a3a4_508k_p9,_a1a2_508k_p9,_a3a4_808k_p11,_a3a4_1628k_p13,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:Audiodeskription,1:deu:TV%20Ton" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "med" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a1a2_508k_p9,_a3a4_508k_p9,_a1a2_808k_p11,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:TV%20Ton,1:deu:Audiodeskription" + }, + { + "cdn": "akamai", + "class": "ad", + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "https://zdfvod.akamaized.net/i/mp4/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs,_a3a4_508k_p9,_a1a2_508k_p9,_a3a4_808k_p11,v15.mp4.csmil/master.m3u8?audiotrack=0:deu:Audiodeskription,1:deu:TV%20Ton" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "low" + } + ], + "type": "h264_aac_ts_http_m3u8_http" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [ + "progressive" + ], + "isAdaptive": false, + "mimeType": "video/mp4", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 1749394430, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_3328k_p15v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 1749394430, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_3328k_p15v15.mp4" + } + ] + }, + "hd": true, + "highestVerticalResolution": 720, + "mimeCodec": "avc1.640028, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "hd" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 861779088, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_1628k_p13v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 861779088, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_1628k_p13v15.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 436592366, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_808k_p11v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 436592366, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_808k_p11v15.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 281801745, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_508k_p9v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 281801745, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_508k_p9v15.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 270, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "low" + } + ], + "type": "h264_aac_mp4_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + }, + { + "formitaeten": [ + { + "facets": [ + "restriction_useragent" + ], + "isAdaptive": false, + "mimeType": "video/mp4", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet", + "qualities": [ + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 861779088, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_1628k_p13v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 861779088, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_1628k_p13v15.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 540, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "veryhigh" + }, + { + "audio": { + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio", + "tracks": [ + { + "cdn": "akamai", + "class": "main", + "filesize": 436592366, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a1a2_808k_p11v15.mp4" + }, + { + "cdn": "akamai", + "class": "ad", + "filesize": 436592366, + "language": "deu", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality/audio/track", + "uri": "http://localhost:8589/none/zdf/23/01/230101_2015_sendung_trs/3/230101_2015_sendung_trs_a3a4_808k_p11v15.mp4" + } + ] + }, + "hd": false, + "highestVerticalResolution": 360, + "mimeCodec": "avc1.4d401f, mp4a.40.2", + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item/formitaet/quality", + "quality": "high" + } + ], + "type": "h264_aac_mp4_http_na_na" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd/priority-list-item" + } + ], + "profile": "http://zdf.de/rels/streams/ptmd", + "scrubPreview": { + "ImageInterval": "2000", + "ImageUrlScheme": "https://pvstreaming.zdf.de/none/img/zdf/23/01/230101_2015_sendung_trs/6/scrubpreview/230101_2015_sendung_trs_%index%.jpg", + "ImagesPerColumn": "5", + "ImagesPerRow": "5" + }, + "self": "/tmd/2/android_native_5/vod/ptmd/mediathek/230101_2015_sendung_trs/6", + "version": 6 +} \ No newline at end of file