2222import java .util .Collection ;
2323import java .util .EnumMap ;
2424import java .util .HashSet ;
25+ import java .util .List ;
2526import java .util .Map ;
2627import java .util .Optional ;
2728import java .util .Set ;
@@ -43,7 +44,6 @@ public class OrfOnEpisodeDeserializer implements JsonDeserializer<OrfOnVideoInfo
4344 private static final String TAG_DESCRIPTION = "description" ;
4445 private static final String TAG_SHARE_BODY = "share_body" ;
4546 private static final String TAG_RIGHT = "right" ;
46- private static final String TAG_VIDEO_TYPE ="video_type" ;
4747 private static final String [] TAG_SUBTITLE = {"_links" , "subtitle" , "href" };
4848 private static final String [] TAG_VIDEO_PATH_1 = {"_embedded" ,"segments" };
4949 private static final String [] TAG_VIDEO_PATH_2 = {"_embedded" , "playlist" , "sources" };
@@ -97,11 +97,14 @@ private Optional<Map<Resolution, FilmUrl>> optimizeUrls(Optional<Map<Resolution,
9797 if (urls .isPresent () && urls .get ().size () == 1 ) {
9898 final Map <Resolution , FilmUrl > urlMap = urls .get ();
9999 final FilmUrl url = urlMap .get (Resolution .NORMAL );
100- final String urlToOptimize = url .getUrl ().toString ();
100+ String urlToOptimize = url .getUrl ().toString ();
101+ for (String s : List .of ("QXA" ,"QXB" )) {
102+ urlToOptimize = urlToOptimize .replace (s , "#Q#" );
103+ }
101104 try {
102- urlMap .put (Resolution .SMALL , new FilmUrl (urlToOptimize .replace ("QXA " , "Q4A" ), 0L ));
103- urlMap .put (Resolution .NORMAL , new FilmUrl (urlToOptimize .replace ("QXA " , "Q6A" ), 0L ));
104- urlMap .put (Resolution .HD , new FilmUrl (urlToOptimize .replace ("QXA " , "Q8C" ), 0L ));
105+ urlMap .put (Resolution .SMALL , new FilmUrl (urlToOptimize .replace ("#Q# " , "Q4A" ), 0L ));
106+ urlMap .put (Resolution .NORMAL , new FilmUrl (urlToOptimize .replace ("#Q# " , "Q6A" ), 0L ));
107+ urlMap .put (Resolution .HD , new FilmUrl (urlToOptimize .replace ("#Q# " , "Q8C" ), 0L ));
105108 } catch (MalformedURLException e ) {}
106109 }
107110 return urls ;
@@ -215,7 +218,15 @@ private Optional<Map<Resolution, FilmUrl>> parseVideoFromSources(JsonElement roo
215218 }
216219 }
217220 }
218- return parseVideoFromThumbnail (root );
221+ Optional <Map <Resolution , FilmUrl >> fallbackThumbnail = parseVideoFromThumbnail (root );
222+ if (fallbackThumbnail .isPresent ()) {
223+ return fallbackThumbnail ;
224+ }
225+ Optional <Map <Resolution , FilmUrl >> fallbackGapless = parseVideoFromGapless (root );
226+ if (fallbackGapless .isPresent ()) {
227+ return fallbackGapless ;
228+ }
229+ return Optional .empty ();
219230 }
220231
221232
@@ -248,6 +259,32 @@ private Optional<Map<Resolution, FilmUrl>> parseVideoFromThumbnail(JsonElement r
248259 return Optional .of (urls );
249260 }
250261
262+ private Optional <Map <Resolution , FilmUrl >> parseVideoFromGapless (JsonElement root ) {
263+ Map <Resolution , FilmUrl > urls = new EnumMap <>(Resolution .class );
264+ try {
265+ Optional <JsonElement > gaplessSourceAT = JsonUtils .getElement (root , "gapless_sources_austria" , "hls" );
266+ if (gaplessSourceAT .isPresent ()) {
267+ gaplessSourceAT .get ().getAsJsonArray ().forEach ( e -> {
268+ Optional <String > url = JsonUtils .getElementValueAsString (e , "src" );
269+ Optional <String > drm = JsonUtils .getElementValueAsString (e , "is_drm_protected" );
270+ try {
271+ if (url .isPresent () && drm .orElse ("" ).equalsIgnoreCase ("false" )) {
272+ urls .put (Resolution .NORMAL , new FilmUrl (url .get (), 0L ));
273+ }
274+ } catch (MalformedURLException err ) {
275+ LOG .error ("Malformed video url {} {}" , url , err );
276+ }
277+ });
278+ }
279+ } catch (Exception e ) {
280+ LOG .error ("generateFallbackVideo {}" , e );
281+ }
282+ if (urls .size () == 0 ) {
283+ return Optional .empty ();
284+ }
285+ return Optional .of (urls );
286+ }
287+
251288 private Optional <Map <Resolution , FilmUrl >> readVideoForTargetCodec (JsonElement urlArray , String targetCodec ) {
252289 Map <Resolution , FilmUrl > urls = new EnumMap <>(Resolution .class );
253290 for (JsonElement videoElement : urlArray .getAsJsonArray ()) {
0 commit comments