@@ -146,7 +146,7 @@ private static Optional<String> parseTopic(final JsonObject playerPageObject) {
146146 private Optional <String > parseTitle (final JsonObject playerPageObject ) {
147147 Optional <String > title = JsonUtils .getAttributeAsString (playerPageObject , ATTRIBUTE_TITLE );
148148 if (title .isPresent ()) {
149- String [] replaceWords = {" - Hörfassung" , " (mit Gebärdensprache)" , " mit Gebärdensprache" ," (mit Audiodeskription)" , "Audiodeskription" };
149+ String [] replaceWords = {" - Hörfassung" , " (mit Gebärdensprache)" , " mit Gebärdensprache" ," (mit Audiodeskription)" , "Audiodeskription" , " - (Originalversion)" , " (OV)" };
150150 String cleanTitle = title .get ().trim ();
151151 for (String replaceWord : replaceWords ) {
152152 cleanTitle = cleanTitle .replace (replaceWord , "" );
@@ -224,80 +224,47 @@ public List<ArdFilmDto> deserialize(
224224
225225 final Optional <String > topic = parseTopic (itemObject );
226226 final Optional <String > title = parseTitle (itemObject );
227- final Optional <String > description
228- = JsonUtils .getAttributeAsString (itemObject , ATTRIBUTE_SYNOPSIS );
227+ final Optional <String > titleoriginal = JsonUtils . getAttributeAsString ( itemObject , ATTRIBUTE_TITLE );
228+ final Optional < String > description = JsonUtils .getAttributeAsString (itemObject , ATTRIBUTE_SYNOPSIS );
229229 final Optional <LocalDateTime > date = parseDate (itemObject );
230230 final Optional <Duration > duration = parseDuration (itemObject );
231231 final Optional <String > partner = parsePartner (itemObject );
232- final Optional <Map <Qualities , String >> videoInfoStandard = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
233- final Optional <Map <Qualities , String >> videoInfoAdaptive = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_CATEGORY_MPEG , MARKER_VIDEO_DE );
234- final Optional <Map <Qualities , String >> videoInfoAD = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_AD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
235- final Optional <Map <Qualities , String >> videoInfoDGS = parseVideoUrls (itemObject , MARKER_VIDEO_DGS , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
236- final Optional <Map <Qualities , String >> videoInfoOV = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_OV );
237- final Optional <String > subtitles = prepareSubtitleUrl (itemObject );
232+ Optional <Map <Qualities , String >> videoInfoStandard = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
233+ Optional <Map <Qualities , String >> videoInfoAdaptive = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_CATEGORY_MPEG , MARKER_VIDEO_DE );
234+ Optional <Map <Qualities , String >> videoInfoAD = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_AD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
235+ Optional <Map <Qualities , String >> videoInfoDGS = parseVideoUrls (itemObject , MARKER_VIDEO_DGS , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
236+ Optional <Map <Qualities , String >> videoInfoOV = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_OV );
237+ Optional <String > subtitles = prepareSubtitleUrl (itemObject );
238238
239239 if (topic .isEmpty () || title .isEmpty () || partner .isEmpty () || ADDITIONAL_SENDER .get (partner .get ()) == null ) {
240240 if (partner .isPresent () && ADDITIONAL_SENDER .get (partner .get ()) == null ) {
241241 LOG .warn ("Missing Partner " + partner .get ());
242242 }
243243 return films ;
244244 }
245-
246-
247-
248- if ((title .get ().toUpperCase ().contains ("(OV)" ) || title .get ().toUpperCase ().contains ("(ORIGINALVERSION)" )) && videoInfoOV .isPresent ()) {
249- final ArdFilmDto filmDto
250- = new ArdFilmDto (
251- createFilm (
252- ADDITIONAL_SENDER .get (partner .get ()),
253- topic .get (),
254- title .get (),
255- description ,
256- date ,
257- duration ,
258- videoInfoOV .get (),
259- subtitles ));
260- films .add (filmDto );
261- return films ;
245+ boolean subVideoPage = titleoriginal .get ().contains (" - (Originalversion)" ) || titleoriginal .get ().contains (" (OV)" )
246+ || titleoriginal .get ().contains (" (mit Gebärdensprache)" ) || titleoriginal .get ().contains (" mit Gebärdensprache" )
247+ || titleoriginal .get ().contains ("- Hörfassung" ) || titleoriginal .get ().contains ("(mit Audiodeskription)" );
248+ // mainly funk
249+ if (videoInfoStandard .isEmpty () && videoInfoAD .isEmpty () && videoInfoDGS .isEmpty () && videoInfoOV .isEmpty () && videoInfoAdaptive .isPresent ()) {
250+ videoInfoStandard = resolveFallbackFromPlaylist (videoInfoAdaptive );
262251 }
263-
264- if (videoInfoStandard .isEmpty () && videoInfoAD .isEmpty () && videoInfoDGS .isEmpty () && videoInfoAdaptive .isPresent ()) {
265- // UUAAAARRGGGG - SAD
266- Map <Qualities , URL > qualitiesUrls = videoInfoAdaptive .get ().entrySet ().stream ()
267- .collect (Collectors .toMap (Map .Entry ::getKey , entry -> {
268- try {
269- return new URL (entry .getValue ());
270- } catch (MalformedURLException e ) {
271- LOG .error ("failed converting string {} to url" , entry .getValue (), e );
272- return null ;
273- }
274- }));
275- if (!qualitiesUrls .containsKey (Qualities .NORMAL )) {
276- qualitiesUrls .put (Qualities .NORMAL , qualitiesUrls .entrySet ().stream ().findFirst ().get ().getValue ());
277- }
278- //
279- ArdVideoInfoJsonDeserializer .loadM3U8 (qualitiesUrls );
280- //
281- Map <Qualities , String > fallback = qualitiesUrls .entrySet ().stream ()
282- .collect (Collectors .toMap (Map .Entry ::getKey , entry -> entry .getValue ().toString ()));
283-
284- if (fallback .size () > 0 ) {
285- final ArdFilmDto filmDto
286- = new ArdFilmDto (
287- createFilm (
288- ADDITIONAL_SENDER .get (partner .get ()),
289- topic .get (),
290- title .get (),
291- description ,
292- date ,
293- duration ,
294- fallback ,
295- subtitles ));
296- films .add (filmDto );
297- }
252+ // incorrect langueage code for OV
253+ if ((titleoriginal .get ().contains (" - (Originalversion)" ) || titleoriginal .get ().contains (" (OV)" )) && videoInfoOV .isEmpty ()) {
254+ videoInfoOV = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , "*" );
298255 }
299-
300- if (videoInfoStandard .isPresent () && videoInfoStandard .get ().size () > 0 ) {
256+ // mainly tagesschau
257+ if ((titleoriginal .get ().contains (" (mit Gebärdensprache)" ) || titleoriginal .get ().contains (" mit Gebärdensprache" )) && videoInfoStandard .isPresent () && videoInfoDGS .isEmpty ()) {
258+ videoInfoDGS = videoInfoStandard ;
259+ videoInfoStandard = Optional .empty ();
260+ }
261+ // in aller freundschaft
262+ if ((titleoriginal .get ().contains ("- Hörfassung" ) || titleoriginal .get ().contains ("(mit Audiodeskription)" )) && videoInfoStandard .isPresent () && videoInfoAD .isEmpty ()) {
263+ videoInfoAD = videoInfoStandard ;
264+ videoInfoStandard = Optional .empty ();
265+ }
266+ //
267+ if (!subVideoPage && videoInfoStandard .isPresent () && videoInfoStandard .get ().size () > 0 ) {
301268 // add film standard
302269 final ArdFilmDto filmDto
303270 = new ArdFilmDto (
@@ -310,9 +277,25 @@ public List<ArdFilmDto> deserialize(
310277 duration ,
311278 videoInfoStandard .get (),
312279 subtitles ));
280+ films .add (filmDto );
313281 if (widgets .size () > 1 ) {
314282 parseRelatedFilms (filmDto , widgets .get (1 ).getAsJsonObject ());
315283 }
284+ }
285+ //
286+ if (videoInfoOV .isPresent () && videoInfoOV .get ().size () > 0 ) {
287+ Map <Qualities , String > vid = videoInfoOV .get ();
288+ final ArdFilmDto filmDto
289+ = new ArdFilmDto (
290+ createFilm (
291+ ADDITIONAL_SENDER .get (partner .get ()),
292+ topic .get (),
293+ title .get () + " (Originalversion)" ,
294+ description ,
295+ date ,
296+ duration ,
297+ vid ,
298+ subtitles ));
316299 films .add (filmDto );
317300 }
318301 //
@@ -329,9 +312,6 @@ public List<ArdFilmDto> deserialize(
329312 duration ,
330313 videoInfoAD .get (),
331314 subtitles ));
332- if (widgets .size () > 1 ) {
333- parseRelatedFilms (filmDto , widgets .get (1 ).getAsJsonObject ());
334- }
335315 films .add (filmDto );
336316 }
337317 //
@@ -348,9 +328,6 @@ public List<ArdFilmDto> deserialize(
348328 duration ,
349329 videoInfoDGS .get (),
350330 subtitles ));
351- if (widgets .size () > 1 ) {
352- parseRelatedFilms (filmDto , widgets .get (1 ).getAsJsonObject ());
353- }
354331 films .add (filmDto );
355332 }
356333
@@ -473,7 +450,8 @@ private Optional<Map<Integer, String>> parseVideoUrlMap(final JsonObject playerP
473450 Optional <String > resh = JsonUtils .getElementValueAsString (video , ATTRIBUTE_RESOLUTION_H );
474451 Optional <String > url = JsonUtils .getElementValueAsString (video , ATTRIBUTE_URL );
475452 Optional <String > languageCode = JsonUtils .getElementValueAsString (audios .get ().getAsJsonArray ().get (0 ), ATTRIBUTE_ADUIO_LANG );
476- if (url .isPresent () && resh .isPresent () && kind .isPresent () && kind .get ().equalsIgnoreCase (aduioType ) && languageCode .orElse ("" ).equalsIgnoreCase (language )) {
453+ if (url .isPresent () && resh .isPresent () && kind .isPresent () && kind .get ().equalsIgnoreCase (aduioType ) &&
454+ (languageCode .orElse ("" ).equalsIgnoreCase (language ) || (language .equalsIgnoreCase ("*" ) && !languageCode .orElse ("" ).equalsIgnoreCase ("deu" )))) {
477455 videoInfo .put (Integer .parseInt (resh .get ()), UrlUtils .removeParameters (url .get ()));
478456 }
479457 }
@@ -486,4 +464,30 @@ private Optional<Map<Integer, String>> parseVideoUrlMap(final JsonObject playerP
486464 }
487465 return Optional .of (videoInfo );
488466 }
467+
468+ private Optional <Map <Qualities , String >> resolveFallbackFromPlaylist (Optional <Map <Qualities , String >> videoInfoAdaptive ) {
469+ Map <Qualities , URL > qualitiesUrls = videoInfoAdaptive .get ().entrySet ().stream ()
470+ .collect (Collectors .toMap (Map .Entry ::getKey , entry -> {
471+ try {
472+ return new URL (entry .getValue ());
473+ } catch (MalformedURLException e ) {
474+ LOG .error ("failed converting string {} to url" , entry .getValue (), e );
475+ return null ;
476+ }
477+ }));
478+ if (!qualitiesUrls .containsKey (Qualities .NORMAL )) {
479+ qualitiesUrls .put (Qualities .NORMAL , qualitiesUrls .entrySet ().stream ().findFirst ().get ().getValue ());
480+ }
481+ //
482+ ArdVideoInfoJsonDeserializer .loadM3U8 (qualitiesUrls );
483+ //
484+ Map <Qualities , String > fallback = qualitiesUrls .entrySet ().stream ()
485+ .collect (Collectors .toMap (Map .Entry ::getKey , entry -> entry .getValue ().toString ()));
486+ //
487+ if (!fallback .containsKey (Qualities .NORMAL ) && !fallback .isEmpty ()) {
488+ fallback .put (Qualities .NORMAL , fallback .entrySet ().stream ().findFirst ().get ().getValue ());
489+ }
490+
491+ return Optional .of (fallback );
492+ }
489493}
0 commit comments