Sfoglia il codice sorgente

Add better alternative filtering

Billy Barrow 2 anni fa
parent
commit
88e7b96e3c
1 ha cambiato i file con 25 aggiunte e 6 eliminazioni
  1. 25 6
      ppvm_player.js

+ 25 - 6
ppvm_player.js

@@ -12,7 +12,7 @@ function setup_playback(description) {
     player.addEventListener("pause", (event) => playStateChanged(false));
     player.addEventListener("playing", (event) => playStateChanged(true));
 
-    filteredOptions = filterOptions(description.entries);
+    filteredOptions = description.entries.filter(o => shouldOfferStream(o, description.entries));
     if(filteredOptions.length == 0){
         player.src = "invalid://invalid";
         document.getElementById("unplayable-modal").showModal();
@@ -51,16 +51,35 @@ function qualitySelected() {
     }
 }
 
-function filterOptions(options) {
-    player = document.getElementById("player");
-    return options.filter(o => o.type === "video" && canPlayStream(o) && (o.metadata.alternative_to == undefined || !canPlayStream(options.find(s => s.label == o.metadata.alternative_to))));
-}
-
 function canPlayStream(stream) {
+    if(stream.type !== "video") {
+        return false;
+    }
     player = document.getElementById("player");
     return player.canPlayType(`${stream.mimetype}; codecs="${stream.metadata.codecs}"`);
 }
 
+function shouldOfferStream(stream, streams) {
+    if(!canPlayStream(stream)) {
+        return false;
+    }
+    if(stream.metadata.alternative_to == undefined) {
+        return true;
+    }
+    return !hasHigherUsableAlternative(stream, streams);
+}
+
+function hasHigherUsableAlternative(stream, streams) {
+    if(stream.metadata.alternative_to == undefined) {
+        return false;
+    }
+    parent = streams.find(s => s.label == stream.metadata.alternative_to);
+    if(canPlayStream(parent)) {
+        return true;
+    }
+    return hasHigherUsableAlternative(parent, streams);
+}
+
 function findOptimalOptionForScreen(options) {
     screenSize = Math.max(window.screen.width, window.screen.height);
     screenSize = screenSize * window.devicePixelRatio