@@ -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,79 +224,43 @@ 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+ // mainly funk
246+ if (videoInfoStandard .isEmpty () && videoInfoAD .isEmpty () && videoInfoDGS .isEmpty () && videoInfoOV .isEmpty () && videoInfoAdaptive .isPresent ()) {
247+ videoInfoStandard = resolveFallbackFromPlaylist (videoInfoAdaptive );
262248 }
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- }
249+ // incorrect langueage code for OV
250+ if ((titleoriginal .get ().contains (" - (Originalversion)" ) || titleoriginal .get ().contains (" (OV)" )) && videoInfoOV .isEmpty ()) {
251+ videoInfoOV = parseVideoUrls (itemObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , "*" );
298252 }
299-
253+ // mainly tagesschau
254+ if ((titleoriginal .get ().contains (" (mit Gebärdensprache)" ) || titleoriginal .get ().contains (" mit Gebärdensprache" )) && videoInfoStandard .isPresent () && videoInfoDGS .isEmpty ()) {
255+ videoInfoDGS = videoInfoStandard ;
256+ videoInfoStandard = Optional .empty ();
257+ }
258+ // in aller freundschaft
259+ if ((titleoriginal .get ().contains ("- Hörfassung" ) || titleoriginal .get ().contains ("(mit Audiodeskription)" )) && videoInfoStandard .isPresent () && videoInfoAD .isEmpty ()) {
260+ videoInfoAD = videoInfoStandard ;
261+ videoInfoStandard = Optional .empty ();
262+ }
263+ //
300264 if (videoInfoStandard .isPresent () && videoInfoStandard .get ().size () > 0 ) {
301265 // add film standard
302266 final ArdFilmDto filmDto
@@ -316,6 +280,22 @@ public List<ArdFilmDto> deserialize(
316280 films .add (filmDto );
317281 }
318282 //
283+ if (videoInfoOV .isPresent () && videoInfoOV .get ().size () > 0 ) {
284+ Map <Qualities , String > vid = videoInfoOV .get ();
285+ final ArdFilmDto filmDto
286+ = new ArdFilmDto (
287+ createFilm (
288+ ADDITIONAL_SENDER .get (partner .get ()),
289+ topic .get (),
290+ title .get () + " (Originalversion)" ,
291+ description ,
292+ date ,
293+ duration ,
294+ vid ,
295+ subtitles ));
296+ films .add (filmDto );
297+ }
298+ //
319299 if (videoInfoAD .isPresent () && videoInfoAD .get ().size () > 0 ) {
320300 // add film ad
321301 final ArdFilmDto filmDto
@@ -473,7 +453,8 @@ private Optional<Map<Integer, String>> parseVideoUrlMap(final JsonObject playerP
473453 Optional <String > resh = JsonUtils .getElementValueAsString (video , ATTRIBUTE_RESOLUTION_H );
474454 Optional <String > url = JsonUtils .getElementValueAsString (video , ATTRIBUTE_URL );
475455 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 )) {
456+ if (url .isPresent () && resh .isPresent () && kind .isPresent () && kind .get ().equalsIgnoreCase (aduioType ) &&
457+ (languageCode .orElse ("" ).equalsIgnoreCase (language ) || (language .equalsIgnoreCase ("*" ) && !languageCode .orElse ("" ).equalsIgnoreCase ("deu" )))) {
477458 videoInfo .put (Integer .parseInt (resh .get ()), UrlUtils .removeParameters (url .get ()));
478459 }
479460 }
@@ -486,4 +467,30 @@ private Optional<Map<Integer, String>> parseVideoUrlMap(final JsonObject playerP
486467 }
487468 return Optional .of (videoInfo );
488469 }
470+
471+ private Optional <Map <Qualities , String >> resolveFallbackFromPlaylist (Optional <Map <Qualities , String >> videoInfoAdaptive ) {
472+ Map <Qualities , URL > qualitiesUrls = videoInfoAdaptive .get ().entrySet ().stream ()
473+ .collect (Collectors .toMap (Map .Entry ::getKey , entry -> {
474+ try {
475+ return new URL (entry .getValue ());
476+ } catch (MalformedURLException e ) {
477+ LOG .error ("failed converting string {} to url" , entry .getValue (), e );
478+ return null ;
479+ }
480+ }));
481+ if (!qualitiesUrls .containsKey (Qualities .NORMAL )) {
482+ qualitiesUrls .put (Qualities .NORMAL , qualitiesUrls .entrySet ().stream ().findFirst ().get ().getValue ());
483+ }
484+ //
485+ ArdVideoInfoJsonDeserializer .loadM3U8 (qualitiesUrls );
486+ //
487+ Map <Qualities , String > fallback = qualitiesUrls .entrySet ().stream ()
488+ .collect (Collectors .toMap (Map .Entry ::getKey , entry -> entry .getValue ().toString ()));
489+ //
490+ if (!fallback .containsKey (Qualities .NORMAL ) && !fallback .isEmpty ()) {
491+ fallback .put (Qualities .NORMAL , fallback .entrySet ().stream ().findFirst ().get ().getValue ());
492+ }
493+
494+ return Optional .of (fallback );
495+ }
489496}
0 commit comments