@@ -39,60 +39,84 @@ public PagedElementListDTO<ZdfFilmDto> deserialize(
3939 final PagedElementListDTO <ZdfFilmDto > films = new PagedElementListDTO <>();
4040
4141 JsonObject rootNode = jsonElement .getAsJsonObject ();
42- JsonArray nodes =
43- rootNode
44- .getAsJsonObject ("data" )
45- .getAsJsonObject ("smartCollectionByCanonical" )
46- .getAsJsonObject ("seasons" )
47- .getAsJsonArray ("nodes" );
48-
49- for (JsonElement element : nodes ) {
50-
51- final JsonObject episodes = element .getAsJsonObject ().getAsJsonObject ("episodes" );
52- final JsonArray episodeNodes = episodes .getAsJsonArray ("nodes" );
53- for (JsonElement episode : episodeNodes ) {
54- final JsonObject episodeObject = episode .getAsJsonObject ();
55- final Optional <String > title = parseTitle (episodeObject );
56- final Optional <String > website =
57- JsonUtils .getAttributeAsString (episodeObject , "sharingUrl" );
58- final Optional <LocalDateTime > time = parseDate (episodeObject );
59- final Optional <String > description =
60- JsonUtils .getAttributeAsString (episodeObject .getAsJsonObject ("teaser" ), "description" );
61- final Optional <String > sender = parseSender (episodeObject );
62-
63- // streamingoptions relevant, um zu erkennen ob uhd/dgs/ad/ov...?
64- final Map <String , String > downloadUrls = new HashMap <>();
65-
66- final JsonArray mediaNodes =
67- episodeObject .getAsJsonObject ("currentMedia" ).getAsJsonArray ("nodes" );
68- for (JsonElement media : mediaNodes ) {
69- final JsonObject mediaObject = media .getAsJsonObject ();
70- final Optional <String > mediaType =
71- JsonUtils .getAttributeAsString (mediaObject , "vodMediaType" );
72- final Optional <String > url = JsonUtils .getAttributeAsString (mediaObject , "ptmdTemplate" );
73- if (mediaType .isPresent () && url .isPresent ()) {
74- downloadUrls .put (mediaType .get (), finalizeDownloadUrl (url .get ()));
75- }
76- }
42+ final JsonObject data = rootNode .getAsJsonObject ("data" );
43+ if (data .isJsonNull ()) {
44+ LOG .error ("ZdfTopicSeasonDeserializer: No data found in response" );
45+ return films ;
46+ }
7747
78- if (title .isPresent ()) {
79- films .addElements (
80- createFilm (
81- ZdfConstants .PARTNER_TO_SENDER .get (sender .orElse ("EMPTY" )),
82- title .get (),
83- description ,
84- website ,
85- time ,
86- downloadUrls ));
87- } else {
88- LOG .error ("ZdfTopicSeasonDeserializer: no title found" );
48+ if (data .has ("smartCollectionByCanonical" )) {
49+ final JsonArray seasonNodes = data .getAsJsonObject ("smartCollectionByCanonical" )
50+ .getAsJsonObject ("seasons" )
51+ .getAsJsonArray ("nodes" );
52+ for (JsonElement element : seasonNodes ) {
53+ final JsonObject episodes = element .getAsJsonObject ().getAsJsonObject ("episodes" );
54+ final JsonArray episodeNodes = episodes .getAsJsonArray ("nodes" );
55+ addFilms (films , episodeNodes );
56+ films .setNextPage (parseNextPage (episodes .getAsJsonObject ("pageInfo" )));
57+ }
58+ }
59+ else if (data .has ("metaCollectionContent" )) {
60+ final JsonObject metaCollectionContent = data .getAsJsonObject ("metaCollectionContent" );
61+ final JsonArray collectionNodes = metaCollectionContent
62+ .getAsJsonArray ("smartCollections" );
63+ addFilms (films , collectionNodes );
64+ films .setNextPage (parseNextPage (metaCollectionContent .getAsJsonObject ("pageInfo" )));
65+ } else {
66+ LOG .error ("ZdfTopicSeasonDeserializer: No valid entry nodes found" );
67+ }
68+ return films ;
69+ }
70+
71+ private void addFilms (PagedElementListDTO <ZdfFilmDto > films , JsonArray episodeNodes ) {
72+ for (JsonElement episode : episodeNodes ) {
73+ final JsonObject episodeObject = episode .getAsJsonObject ();
74+ final Optional <String > title = parseTitle (episodeObject );
75+ final Optional <String > website =
76+ JsonUtils .getAttributeAsString (episodeObject , "sharingUrl" );
77+ final Optional <LocalDateTime > time = parseDate (episodeObject );
78+ final Optional <String > description =
79+ JsonUtils .getAttributeAsString (episodeObject .getAsJsonObject ("teaser" ), "description" );
80+ final Optional <String > sender = parseSender (episodeObject );
81+
82+ // streamingoptions relevant, um zu erkennen ob uhd/dgs/ad/ov...?
83+ final Map <String , String > downloadUrls = new HashMap <>();
84+
85+ final JsonArray mediaNodes = getMediaNodes (episodeObject );
86+ for (JsonElement media : mediaNodes ) {
87+ final JsonObject mediaObject = media .getAsJsonObject ();
88+ final Optional <String > mediaType =
89+ JsonUtils .getAttributeAsString (mediaObject , "vodMediaType" );
90+ final Optional <String > url = JsonUtils .getAttributeAsString (mediaObject , "ptmdTemplate" );
91+ if (mediaType .isPresent () && url .isPresent ()) {
92+ downloadUrls .put (mediaType .get (), finalizeDownloadUrl (url .get ()));
8993 }
9094 }
9195
92- films .setNextPage (parseNextPage (episodes .getAsJsonObject ("pageInfo" )));
96+ if (title .isPresent ()) {
97+ films .addElements (
98+ createFilm (
99+ ZdfConstants .PARTNER_TO_SENDER .get (sender .orElse ("EMPTY" )),
100+ title .get (),
101+ description ,
102+ website ,
103+ time ,
104+ downloadUrls ));
105+ } else {
106+ LOG .error ("ZdfTopicSeasonDeserializer: no title found" );
107+ }
93108 }
109+ }
94110
95- return films ;
111+ private JsonArray getMediaNodes (JsonObject episodeObject ) {
112+ JsonObject videoRootObject = episodeObject ;
113+ if (episodeObject .has ("video" )) {
114+ videoRootObject = episodeObject .getAsJsonObject ("video" );
115+ }
116+ if (!videoRootObject .has ("currentMedia" )) {
117+ return new JsonArray ();
118+ }
119+ return videoRootObject .getAsJsonObject ("currentMedia" ).getAsJsonArray ("nodes" );
96120 }
97121
98122 private Optional <String > parseSender (JsonObject episodeObject ) {
@@ -130,13 +154,18 @@ private Optional<String> parseTitle(final JsonObject episodeObject) {
130154 Optional <String > resultingTitle = formatTitle (title , subtitle );
131155
132156 if (resultingTitle .isPresent ()) {
133- final Optional <Integer > season =
134- JsonUtils .getAttributeAsInt (episodeObject .getAsJsonObject ("episodeInfo" ), "seasonNumber" );
135- final Optional <Integer > episode =
136- JsonUtils .getAttributeAsInt (
137- episodeObject .getAsJsonObject ("episodeInfo" ), "episodeNumber" );
138- final Optional <String > seasonEpisodeTitle = formatEpisodeTitle (season , episode );
139- return cleanupTitle ((resultingTitle .get () + " " + seasonEpisodeTitle .orElse ("" )).trim ());
157+ if (episodeObject .has ("episodeInfo" )) {
158+ final Optional <Integer > season =
159+ JsonUtils .getAttributeAsInt (
160+ episodeObject .getAsJsonObject ("episodeInfo" ), "seasonNumber" );
161+ final Optional <Integer > episode =
162+ JsonUtils .getAttributeAsInt (
163+ episodeObject .getAsJsonObject ("episodeInfo" ), "episodeNumber" );
164+ final Optional <String > seasonEpisodeTitle = formatEpisodeTitle (season , episode );
165+ return cleanupTitle ((resultingTitle .get () + " " + seasonEpisodeTitle .orElse ("" )).trim ());
166+ } else {
167+ return cleanupTitle (resultingTitle .get ());
168+ }
140169 }
141170 return Optional .empty ();
142171 }
0 commit comments