@@ -59,9 +59,12 @@ public class ZdfFilmDetailDeserializer implements JsonDeserializer<Optional<ZdfF
59
59
private static final DateTimeFormatter DATE_FORMATTER_AIRTIME =
60
60
DateTimeFormatter .ofPattern ("yyyy-MM-dd'T'HH:mm:ssXXX" ); // 2016-10-29T16:15:00+02:00
61
61
62
+ private static final String EPISODENUMBER = "episodeNumber" ;
63
+ private static final String [] SEASONNUMBER = {"http://zdf.de/rels/cmdm/season" , "seasonNumber" };
64
+
62
65
private final String apiUrlBase ;
63
66
private final Sender sender ;
64
-
67
+
65
68
public ZdfFilmDetailDeserializer (final String apiUrlBase , final Sender sender ) {
66
69
this .apiUrlBase = apiUrlBase ;
67
70
this .sender = sender ;
@@ -98,9 +101,9 @@ public Optional<ZdfFilmDto> deserialize(
98
101
final Optional <String > website = parseWebsiteUrl (rootNode );
99
102
final Optional <LocalDateTime > time = parseAirtime (rootNode , programItemTarget );
100
103
final Optional <Duration > duration = parseDuration (mainVideoTarget );
101
-
104
+
102
105
final Map <String , String > downloadUrl = parseDownloadUrls (mainVideoTarget );
103
-
106
+
104
107
if (title .isPresent ()) {
105
108
final Optional <Film > film =
106
109
createFilm (topic , title .get (), description , website , time , duration );
@@ -260,36 +263,50 @@ private Optional<String> parseDescription(final JsonObject aRootNode) {
260
263
}
261
264
262
265
private Optional <String > parseTitle (final JsonObject aRootNode , final JsonObject aTarget ) {
263
- final Optional <String > title = parseTitleValue (aRootNode , aTarget );
264
- return title .map (s -> s .replaceAll ("\\ (CC.*\\ ) - .* Creative Commons.*" , "" ));
266
+ final Optional <String > programmTitle = JsonUtils .getElementValueAsString (aRootNode , JSON_ELEMENT_TITLE );
267
+ final Optional <String > programmSubtitle = JsonUtils .getElementValueAsString (aRootNode , JSON_ELEMENT_SUBTITLE );
268
+ Optional <String > resultingTitle = formatTitle (programmTitle , programmSubtitle );
269
+ if (resultingTitle .isEmpty ()) {
270
+ final Optional <String > targetTitle = JsonUtils .getElementValueAsString (aTarget , JSON_ELEMENT_TITLE );
271
+ final Optional <String > targetSubtitle = JsonUtils .getElementValueAsString (aTarget , JSON_ELEMENT_SUBTITLE );
272
+ resultingTitle = formatTitle (targetTitle , targetSubtitle );
273
+ }
274
+ if (resultingTitle .isPresent ()) {
275
+ final Optional <Integer > season = JsonUtils .getElementValueAsInteger (aTarget , SEASONNUMBER );
276
+ final Optional <Integer > episode = JsonUtils .getElementValueAsInteger (aTarget , EPISODENUMBER );
277
+ final Optional <String > seasonEpisodeTitle = formatEpisodeTitle (season , episode );
278
+ return cleanupTitle ((resultingTitle .get () + " " + seasonEpisodeTitle .orElse ("" )).trim ());
279
+ }
280
+ return Optional .empty ();
265
281
}
266
-
267
- private Optional <String > parseTitleValue (final JsonObject aRootNode , final JsonObject aTarget ) {
268
- // use property "title" if found
269
- final JsonElement titleElement = aRootNode .get (JSON_ELEMENT_TITLE );
270
- if (titleElement != null ) {
271
- final JsonElement subTitleElement = aRootNode .get (JSON_ELEMENT_SUBTITLE );
272
- if (subTitleElement != null && !subTitleElement .getAsString ().isBlank ()) {
273
- return Optional .of (
274
- titleElement .getAsString ().trim () + " - " + subTitleElement .getAsString ());
275
- } else {
276
- return Optional .of (titleElement .getAsString ());
277
- }
282
+
283
+ private Optional <String > cleanupTitle (String title ) {
284
+ return Optional .of (title .replaceAll ("\\ (CC.*\\ ) - .* Creative Commons.*" , "" ));
285
+ }
286
+
287
+ private Optional <String > formatTitle (Optional <String > title , Optional <String > sub ) {
288
+ if (title .isEmpty ()) {
289
+ return Optional .empty ();
290
+ }
291
+ if (sub .isPresent () && !sub .get ().trim ().isEmpty ()) {
292
+ return Optional .of (title .get ().trim () + " - " + sub .get ().trim ());
278
293
} else {
279
- // programmItem target required to determine title
280
- if (aTarget != null && aTarget .has (JSON_ELEMENT_TITLE )) {
281
- final String title = aTarget .get (JSON_ELEMENT_TITLE ).getAsString ();
282
- final String subTitle = aTarget .get (JSON_ELEMENT_SUBTITLE ).getAsString ();
283
-
284
- if (subTitle .isEmpty ()) {
285
- return Optional .of (title );
286
- } else {
287
- return Optional .of (title .trim () + " - " + subTitle );
288
- }
289
- }
294
+ return Optional .of (title .get ().trim ());
290
295
}
291
-
292
- return Optional .empty ();
296
+ }
297
+
298
+ private Optional <String > formatEpisodeTitle (Optional <Integer > season , Optional <Integer > episode ) {
299
+ if (season .isEmpty () && episode .isEmpty ()) {
300
+ return Optional .empty ();
301
+ }
302
+ String result = "" ;
303
+ if (season .isPresent ()) {
304
+ result += String .format ("S%02d" , season .get ());
305
+ }
306
+ if (episode .isPresent ()) {
307
+ result += String .format ("E%02d" , episode .get ());
308
+ }
309
+ return Optional .of ("(" +result +")" );
293
310
}
294
311
295
312
private Optional <String > parseTopic (final JsonObject aRootNode ) {
0 commit comments