@@ -166,15 +166,15 @@ public List<ArdFilmDto> deserialize(
166166 final JsonObject itemObject = widgets .get (0 ).getAsJsonObject ();
167167
168168 final Optional <String > topic = parseTopic (itemObject );
169+ Optional <String > titleOriginal = JsonUtils .getAttributeAsString (itemObject , ATTRIBUTE_TITLE );
169170 final Optional <String > title = parseTitle (itemObject );
170- final Optional <String > description =
171- JsonUtils .getAttributeAsString (itemObject , ATTRIBUTE_SYNOPSIS );
171+ final Optional <String > description = JsonUtils .getAttributeAsString (itemObject , ATTRIBUTE_SYNOPSIS );
172172 final Optional <LocalDateTime > date = parseDate (itemObject );
173173 final Optional <Duration > duration = parseDuration (itemObject );
174174 //final Sender sender = determinePartner(itemObject);
175175 final Optional <String > partner = parsePartner (itemObject );
176176 final Sender sender = ArdConstants .PARTNER_TO_SENDER .get (partner .orElse ("" ));
177- final Optional <ArdVideoInfoDto > videoInfo = parseVideos (itemObject , title .orElse ("" ));
177+ final Optional <ArdVideoInfoDto > videoInfo = parseVideos (itemObject , titleOriginal .orElse ("" ));
178178
179179 if (title .isEmpty () || topic .isEmpty () || videoInfo .isEmpty ()) {
180180 return films ;
@@ -190,20 +190,42 @@ public List<ArdFilmDto> deserialize(
190190 }
191191
192192 // add film to ARD
193- final ArdFilmDto filmDto =
194- new ArdFilmDto (
195- createFilm (
196- sender ,
197- topic .get (),
198- title .get (),
199- description .orElse (null ),
200- date .orElse (null ),
201- duration .orElse (null ),
202- videoInfo .get ()));
203- if (widgets .size () > 1 ) {
204- parseRelatedFilms (filmDto , widgets .get (1 ).getAsJsonObject ());
193+ if (!videoInfo .get ().getVideoUrls ().isEmpty () ||
194+ !videoInfo .get ().getVideoUrlsAD ().isEmpty () ||
195+ !videoInfo .get ().getVideoUrlsDGS ().isEmpty ()) {
196+ final ArdFilmDto filmDto =
197+ new ArdFilmDto (
198+ createFilm (
199+ sender ,
200+ topic .get (),
201+ title .get (),
202+ description .orElse (null ),
203+ date .orElse (null ),
204+ duration .orElse (null ),
205+ videoInfo .get ()));
206+ if (widgets .size () > 1 ) {
207+ parseRelatedFilms (filmDto , widgets .get (1 ).getAsJsonObject ());
208+ }
209+ films .add (filmDto );
210+ }
211+ // OV - long term this should go into Film as "OV"
212+ if (!videoInfo .get ().getVideoUrlsOV ().isEmpty ()) {
213+ ArdVideoInfoDto allVideoUrlsOV = new ArdVideoInfoDto ();
214+ allVideoUrlsOV .putAll (videoInfo .get ().getVideoUrlsOV ());
215+ allVideoUrlsOV .setSubtitleUrl (videoInfo .get ().getSubtitleUrl ());
216+ final ArdFilmDto filmDtoOV =
217+ new ArdFilmDto (
218+ createFilm (
219+ sender ,
220+ topic .get (),
221+ title .get () + " (Originalversion)" ,
222+ description .orElse (null ),
223+ date .orElse (null ),
224+ duration .orElse (null ),
225+ allVideoUrlsOV ));
226+ films .add (filmDtoOV );
205227 }
206- films . add ( filmDto );
228+
207229 return films ;
208230 }
209231
@@ -228,7 +250,7 @@ private Optional<Map<Resolution, String>> fallbackToM3U(Optional<ArdVideoInfoDto
228250 private Optional <String > parseTitle (final JsonObject playerPageObject ) {
229251 Optional <String > title = JsonUtils .getAttributeAsString (playerPageObject , ATTRIBUTE_TITLE );
230252 if (title .isPresent ()) {
231- String [] replaceWords = {" - Hörfassung" , " (mit Gebärdensprache)" , " mit Gebärdensprache" ," (mit Audiodeskription)" , "Audiodeskription" };
253+ String [] replaceWords = {" - Hörfassung" , " (mit Gebärdensprache)" , " mit Gebärdensprache" ," (mit Audiodeskription)" , "Audiodeskription" , " - (Originalversion)" , " (OV)" };
232254 String cleanTitle = title .get ().trim ();
233255 for (String replaceWord : replaceWords ) {
234256 cleanTitle = cleanTitle .replace (replaceWord , "" );
@@ -299,8 +321,8 @@ private Film createFilm(
299321
300322 film .setGeoLocations (GeoLocationGuesser .getGeoLocations (Sender .ARD , videoInfo .getDefaultVideoUrl ()));
301323
302- if (videoInfo .getSubtitleUrl ().isPresent ()) {
303- for (String subtitleUrl : videoInfo .getSubtitleUrl (). get () ) {
324+ if (! videoInfo .getSubtitleUrl ().isEmpty ()) {
325+ for (String subtitleUrl : videoInfo .getSubtitleUrl ()) {
304326 try {
305327 film .addSubtitle (new URL (subtitleUrl ));
306328 } catch (final MalformedURLException ex ) {
@@ -357,40 +379,39 @@ private void addDGSUrls(final Film film, final Map<Resolution, String> videoUrls
357379 private Optional <ArdVideoInfoDto > parseVideos (final JsonObject playerPageObject , final String title ) {
358380 ArdVideoInfoDto allVideoUrls = new ArdVideoInfoDto ();
359381 //
360- final Optional <Map <Resolution , String >> videoInfoStandard = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
361- final Optional <Map <Resolution , String >> videoInfoAdaptive = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_CATEGORY_MPEG , MARKER_VIDEO_DE );
362- final Optional <Map <Resolution , String >> videoInfoAD = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_AD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
363- final Optional <Map <Resolution , String >> videoInfoDGS = parseVideoUrls (playerPageObject , MARKER_VIDEO_DGS , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
364- final Optional <Map <Resolution , String >> videoInfoOV = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_OV );
365- final Optional <Set <String >> subtitles = prepareSubtitleUrl (playerPageObject );
366- //
367- // OV is a single film but also included in the standard film
368- if ((title .toUpperCase ().contains ("(OV)" ) || title .toUpperCase ().contains ("(ORIGINALVERSION)" )) && videoInfoOV .isPresent ()) {
369- allVideoUrls .putAll (videoInfoOV .get ());
370- return Optional .of (allVideoUrls );
371- }
372- //
373- if (subtitles .isPresent ()) {
374- allVideoUrls .setSubtitleUrl (subtitles );
375- }
376- if (videoInfoAD .isPresent ()) {
377- allVideoUrls .putAllAD (videoInfoAD .get ());
378- }
379- if (videoInfoDGS .isPresent ()) {
380- allVideoUrls .putAllDGS (videoInfoDGS .get ());
381- }
382- // Sometimes we have DGS & standard
383- if (videoInfoStandard .isPresent () && !(videoInfoDGS .isPresent () && title .contains ("Gebärdensprache" ))) {
384- allVideoUrls .putAll (videoInfoStandard .get ());
385- } else if (videoInfoAdaptive .isPresent () && !(videoInfoDGS .isPresent () && title .contains ("Gebärdensprache" ))) {
382+ Optional <Map <Resolution , String >> videoInfoStandard = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
383+ Optional <Map <Resolution , String >> videoInfoAdaptive = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_CATEGORY_MPEG , MARKER_VIDEO_DE );
384+ Optional <Map <Resolution , String >> videoInfoAD = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_AD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
385+ Optional <Map <Resolution , String >> videoInfoDGS = parseVideoUrls (playerPageObject , MARKER_VIDEO_DGS , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_DE );
386+ Optional <Map <Resolution , String >> videoInfoOV = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , MARKER_VIDEO_OV );
387+ Optional <Set <String >> subtitles = prepareSubtitleUrl (playerPageObject );
388+ // mainly funk
389+ if (videoInfoStandard .isEmpty () && videoInfoAD .isEmpty () && videoInfoDGS .isEmpty () && videoInfoOV .isEmpty () && videoInfoAdaptive .isPresent ()) {
386390 ArdVideoInfoDto fallbackM3UUrl = new ArdVideoInfoDto ();
387391 fallbackM3UUrl .putAll (videoInfoAdaptive .get ());
388392 Optional <Map <Resolution , String >> fallback = fallbackToM3U (Optional .of (fallbackM3UUrl ));
389- if (fallback .isPresent ()) {
390- allVideoUrls .putAll (fallback .get ());
391- }
393+ videoInfoStandard = fallback ;
394+ }
395+ // flaws - missing proper video marker - mainly tagesschau
396+ if ((title .contains (" - (Originalversion)" ) || title .contains (" (OV)" )) && videoInfoOV .isEmpty ()) {
397+ videoInfoOV = parseVideoUrls (playerPageObject , MARKER_VIDEO_CATEGORY_MAIN , MARKER_VIDEO_STANDARD , MARKER_VIDEO_MP4 , "*" );
398+ }
399+ if ((title .contains (" (mit Gebärdensprache)" ) || title .contains (" mit Gebärdensprache" )) && videoInfoStandard .isPresent () && videoInfoDGS .isEmpty ()) {
400+ videoInfoDGS = videoInfoStandard ;
401+ videoInfoStandard = Optional .empty ();
392402 }
393- if (allVideoUrls .getVideoUrls ().isEmpty () && allVideoUrls .getVideoUrlsAD ().isEmpty () && allVideoUrls .getVideoUrlsDGS ().isEmpty () ) {
403+ if ((title .contains ("- Hörfassung" ) || title .contains ("(mit Audiodeskription)" )) && videoInfoStandard .isPresent () && videoInfoAD .isEmpty ()) {
404+ videoInfoAD = videoInfoStandard ;
405+ videoInfoStandard = Optional .empty ();
406+ }
407+
408+ videoInfoStandard .ifPresent (allVideoUrls ::putAll );
409+ videoInfoAD .ifPresent (allVideoUrls ::putAllAD );
410+ videoInfoDGS .ifPresent (allVideoUrls ::putAllDGS );
411+ videoInfoOV .ifPresent (allVideoUrls ::putAllOV );
412+ subtitles .ifPresent (allVideoUrls ::setSubtitleUrl );
413+
414+ if (allVideoUrls .getVideoUrls ().isEmpty () && allVideoUrls .getVideoUrlsAD ().isEmpty () && allVideoUrls .getVideoUrlsDGS ().isEmpty () && allVideoUrls .getVideoUrlsOV ().isEmpty () ) {
394415 return Optional .empty ();
395416 }
396417 return Optional .of (allVideoUrls );
@@ -442,7 +463,8 @@ private Optional<Map<Integer, String>> parseVideoUrlMap(final JsonObject playerP
442463 Optional <String > resh = JsonUtils .getElementValueAsString (video , ATTRIBUTE_RESOLUTION_H );
443464 Optional <String > url = JsonUtils .getElementValueAsString (video , ATTRIBUTE_URL );
444465 Optional <String > languageCode = JsonUtils .getElementValueAsString (audios .get ().getAsJsonArray ().get (0 ), ATTRIBUTE_ADUIO_LANG );
445- if (url .isPresent () && resh .isPresent () && kind .isPresent () && kind .get ().equalsIgnoreCase (aduioType ) && languageCode .orElse ("" ).equalsIgnoreCase (language )) {
466+ if (url .isPresent () && resh .isPresent () && kind .isPresent () && kind .get ().equalsIgnoreCase (aduioType ) &&
467+ (languageCode .orElse ("" ).equalsIgnoreCase (language ) || (language .equalsIgnoreCase ("*" ) && !languageCode .orElse ("" ).equalsIgnoreCase ("deu" ) && !languageCode .orElse ("" ).equalsIgnoreCase ("ov" )))) {
446468 videoInfo .put (Integer .parseInt (resh .get ()), UrlUtils .removeParameters (url .get ()));
447469 }
448470 }
0 commit comments