From 4ce7591688cc4ebd4dd1f60eaebd5a8fe3aa66ad Mon Sep 17 00:00:00 2001
From: Kelvin <kelvin@futo.org>
Date: Fri, 9 Aug 2024 15:12:37 +0200
Subject: [PATCH] Fix playback tracker, don't request ios if other failure

---
 YoutubeConfig.json |  2 +-
 YoutubeScript.js   | 70 ++++++++++++++++++++++++----------------------
 2 files changed, 38 insertions(+), 34 deletions(-)

diff --git a/YoutubeConfig.json b/YoutubeConfig.json
index 87a2276..a5b6c0a 100644
--- a/YoutubeConfig.json
+++ b/YoutubeConfig.json
@@ -7,7 +7,7 @@
 	"sourceUrl": "https://plugins.grayjay.app/Youtube/YoutubeConfig.json",
 	"repositoryUrl": "https://futo.org",
 	"scriptUrl": "./YoutubeScript.js",
-	"version": 190,
+	"version": 191,
 	"iconUrl": "./youtube.png",
 	"id": "35ae969a-a7db-11ed-afa1-0242ac120002",
 
diff --git a/YoutubeScript.js b/YoutubeScript.js
index 8af0b61..1f83ec0 100644
--- a/YoutubeScript.js
+++ b/YoutubeScript.js
@@ -390,41 +390,36 @@ source.getContentDetails = (url, useAuth, simplify) => {
 	let retryAttemptCount = 0;
 	let isValid = false;
 	const attemptCountMax = 1;
-	while(!isValid && retryAttemptCount < attemptCountMax) {
-		const invalidExperiments = [51217102, 51217476];
-		var invalidExperimentIndexes = invalidExperiments.map(x=>clientConfig.FEXP_EXPERIMENTS.indexOf(x));
-		if(clientConfig.FEXP_EXPERIMENTS && invalidExperimentIndexes.filter(x=>x >= 0).length > 0) {
-			retryAttemptCount++;
-			log("DETECTED BLOCKING ATTEMPT [" + JSON.stringify(invalidExperimentIndexes) + "]");
-			log("EXPIDS: " + JSON.stringify(clientConfig.FEXP_EXPERIMENTS));
-			//bridge.toast("Detected Youtube blocking attempt, bypassing.. (" + retryAttemptCount + ")");
-			
-			resps[0] = http.GET(url, headersUsed, false);
-			if(!resps[0].isOk)
-				throw new ScriptException("Failed to request page [" + resps[0].code + "]");
-			throwIfCaptcha(resps[0]);
-					
-			html = resps[0].body;//requestPage(url);
-			initialData = getInitialData(html);
-			initialPlayerData = getInitialPlayerData(html);
-			clientConfig = getClientConfig(html);
-			continue;
-		}
+	if(!simplify)
+		while(!isValid && retryAttemptCount < attemptCountMax) {
+			const invalidExperiments = [51217102, 51217476];
+			var invalidExperimentIndexes = invalidExperiments.map(x=>clientConfig.FEXP_EXPERIMENTS.indexOf(x));
+			if(clientConfig.FEXP_EXPERIMENTS && invalidExperimentIndexes.filter(x=>x >= 0).length > 0) {
+				retryAttemptCount++;
+				log("DETECTED BLOCKING ATTEMPT [" + JSON.stringify(invalidExperimentIndexes) + "]");
+				log("EXPIDS: " + JSON.stringify(clientConfig.FEXP_EXPERIMENTS));
+				//bridge.toast("Detected Youtube blocking attempt, bypassing.. (" + retryAttemptCount + ")");
+				
+				resps[0] = http.GET(url, headersUsed, false);
+				if(!resps[0].isOk)
+					throw new ScriptException("Failed to request page [" + resps[0].code + "]");
+				throwIfCaptcha(resps[0]);
+						
+				html = resps[0].body;//requestPage(url);
+				initialData = getInitialData(html);
+				initialPlayerData = getInitialPlayerData(html);
+				clientConfig = getClientConfig(html);
+				continue;
+			}
 
-		if(retryAttemptCount > 0) {
-			log("RESOLVED EXPIDS: " + JSON.stringify(clientConfig.FEXP_EXPERIMENTS))
+			if(retryAttemptCount > 0) {
+				log("RESOLVED EXPIDS: " + JSON.stringify(clientConfig.FEXP_EXPERIMENTS))
+			}
+			isValid = true;
 		}
-		isValid = true;
-	}
-	let forceiOSSources = false;
-	if(retryAttemptCount >= attemptCountMax) {
-		bridge.toast("Detected Youtube blocking attempt, fallback to iOS.. (" + retryAttemptCount + ")");
-		forceiOSSources = true;
-	}
-	else if(retryAttemptCount > 0)
-		bridge.toast("Detected Youtube blocking attempt, bypassed.. (" + retryAttemptCount + ")");
 
-    if(initialPlayerData?.playabilityStatus?.status == "UNPLAYABLE")
+
+		if(initialPlayerData?.playabilityStatus?.status == "UNPLAYABLE")
 		throw new UnavailableException("Video unplayable");
 	
 	const jsUrlMatch = html.match("PLAYER_JS_URL\"\\s?:\\s?\"(.*?)\"");
@@ -459,6 +454,15 @@ source.getContentDetails = (url, useAuth, simplify) => {
 	if (initialPlayerData.playabilityStatus?.status == "LOGIN_REQUIRED") {
 		throw new ScriptException("Login required\nReason: " + initialPlayerData?.playabilityStatus?.reason);
 	}
+	
+	let forceiOSSources = false;
+	if(retryAttemptCount >= attemptCountMax) {
+		bridge.toast("Detected Youtube blocking attempt, fallback to iOS.. (" + retryAttemptCount + ")");
+		forceiOSSources = true;
+	}
+	else if(retryAttemptCount > 0)
+		bridge.toast("Detected Youtube blocking attempt, bypassed.. (" + retryAttemptCount + ")");
+
 		
 	if(IS_TESTING) {
 		console.log("Initial Data", initialData);
@@ -856,7 +860,7 @@ source.getPlaybackTracker = function(url, initialPlayerData) {
 	if(!_settings["youtubeActivity"] || !bridge.isLoggedIn())
 		return null;
 	if(!initialPlayerData) {
-		const video = source.getContentDetails(url, true);
+		const video = source.getContentDetails(url, true, true);
 		initialPlayerData = video.__playerData;
 		if(!initialPlayerData)
 			throw new ScriptException("No playerData for playback tracker");
-- 
GitLab