From e2a7cf1013d6c2b12fa86ef7ae6f463468d0216d Mon Sep 17 00:00:00 2001
From: curche <72807749+curche@users.noreply.github.com>
Date: Thu, 8 Apr 2021 18:24:05 +0530
Subject: [PATCH] handle interactive xkcd comics (#6474)

* handle interactive xkcd comics

Some xkcd comics tend to be interactive and can only be played in a regular browser
These cannot be loaded in the app and the reader loads indefinitely
Instead, we throw a text image with a message to open in browser

the div#comic img attribute will be null/empty in case of parsing interactive
comics and is then replaced with an image warning

uses fakeimagepl to generate image from text

closes https://github.com/tachiyomiorg/tachiyomi-extensions/issues/6370

* update build.gradle version code for xkcd
---
 src/en/xkcd/build.gradle                           |  2 +-
 .../eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt  | 14 ++++++++++++--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/en/xkcd/build.gradle b/src/en/xkcd/build.gradle
index 5e0c39659..5287edba3 100644
--- a/src/en/xkcd/build.gradle
+++ b/src/en/xkcd/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'xkcd'
     pkgNameSuffix = 'en.xkcd'
     extClass = '.Xkcd'
-    extVersionCode = 8
+    extVersionCode = 9
     libVersion = '1.2'
 }
 
diff --git a/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt b/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt
index 4e7347f21..bb2480f4b 100644
--- a/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt
+++ b/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt
@@ -59,12 +59,22 @@ class Xkcd : ParsedHttpSource() {
     override fun pageListParse(document: Document): List<Page> {
         val titleWords: Sequence<String>
         val altTextWords: Sequence<String>
+        val interactiveText = listOf(
+            "To experience the", "interactive version of this comic,",
+            "open it in WebView/browser."
+        )
+            .joinToString(separator = "%0A")
+            .replace(" ", "%20")
 
         // transforming filename from info.0.json isn't guaranteed to work, stick to html
         // if an HD image is available it'll be the srcset attribute
+        // if img tag is empty then it is an interactive comic viewable only in browser
         val image = document.select("div#comic img").let {
-            if (it.hasAttr("srcset")) it.attr("abs:srcset").substringBefore(" ")
-            else it.attr("abs:src")
+            when {
+                it == null || it.isEmpty() -> baseAltTextUrl + interactiveText + baseAltTextPostUrl
+                it.hasAttr("srcset") -> it.attr("abs:srcset").substringBefore(" ")
+                else -> it.attr("abs:src")
+            }
         }
 
         // create a text image for the alt text