From 45fb0d4d7152da4cd0be913e7b672a7cae58f04e Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Thu, 4 Sep 2025 13:46:18 +0300 Subject: [PATCH] Extend Video Deleted parsing --- README.md | 2 +- .../ThrowIfVideoIsDeletedResponse.kt | 14 +++++++---- .../network/TikTokDownloadRemoteSourceTest.kt | 17 +++++++++++++ .../resources/response/video_deleted_v1.html | 24 +++++++++++++++++++ 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 app/src/test/resources/response/video_deleted_v1.html diff --git a/README.md b/README.md index 710bac6..6856c7d 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,6 @@ Example getting the stack trace for a specific error message: `jq -r '.[].errors[] | select(.message == "Parsing Error") | .stacktrace' errors.json` Or getting all htmls if an error happened in the json: -`jq '.[] | select(.errors[]?.message == "Parsing Error") | .errors[].html'` +`jq '.[] | select(.errors[]?.message == "Parsing Error") | .errors[].html' errors.json` > Use -r when you want to avoid the JSON string quotes around output. \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/network/parsing/converter/ThrowIfVideoIsDeletedResponse.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/network/parsing/converter/ThrowIfVideoIsDeletedResponse.kt index 1627c39..c575a4a 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/data/network/parsing/converter/ThrowIfVideoIsDeletedResponse.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/network/parsing/converter/ThrowIfVideoIsDeletedResponse.kt @@ -4,12 +4,18 @@ import org.fnives.tiktokdownloader.data.network.exceptions.VideoDeletedException class ThrowIfVideoIsDeletedResponse { + private val potentialIssues = listOf( + "\"statusMsg\":\"status_deleted", + "\"statusMsg\":\"item doesn't exist", + "statusMsg\":\"[^\"]*status_audit_not_pass" + ) + @Throws(VideoDeletedException::class) fun invoke(html: String) { - if (html.contains("\"statusMsg\":\"status_deleted")) { - throw VideoDeletedException(html = html) - } else if (html.contains("\"statusMsg\":\"item doesn't exist")) { - throw VideoDeletedException(html = html) + potentialIssues.forEach { + if (html.contains(it.toRegex())) { + throw VideoDeletedException(html = html) + } } } } \ No newline at end of file diff --git a/app/src/test/java/org/fnives/tiktokdownloader/data/network/TikTokDownloadRemoteSourceTest.kt b/app/src/test/java/org/fnives/tiktokdownloader/data/network/TikTokDownloadRemoteSourceTest.kt index c60cb2c..c5807c7 100644 --- a/app/src/test/java/org/fnives/tiktokdownloader/data/network/TikTokDownloadRemoteSourceTest.kt +++ b/app/src/test/java/org/fnives/tiktokdownloader/data/network/TikTokDownloadRemoteSourceTest.kt @@ -8,6 +8,7 @@ import org.fnives.tiktokdownloader.data.model.VideoInSavingIntoFile import org.fnives.tiktokdownloader.data.network.exceptions.CaptchaRequiredException import org.fnives.tiktokdownloader.data.network.exceptions.NetworkException import org.fnives.tiktokdownloader.data.network.exceptions.ParsingException +import org.fnives.tiktokdownloader.data.network.exceptions.VideoDeletedException import org.fnives.tiktokdownloader.di.module.NetworkModule import org.fnives.tiktokdownloader.helper.readResourceFile import org.junit.jupiter.api.AfterEach @@ -260,8 +261,21 @@ class TikTokDownloadRemoteSourceTest { } } + @Test + fun GIVEN_deleted_video_response_v1_THEN_proper_Exception_is_Returned() { + Assertions.assertThrows(VideoDeletedException::class.java) { + runBlocking { + val deletedResponse = readResourceFileDeletedV1UrlResponse() + mockWebServer.enqueue(MockResponse().setResponseCode(200).setBody(deletedResponse)) + + sut.getVideo(VideoInPending("", TEST_URL)) + } + } + } + companion object { private const val SHORTENED_URL_RESPONSE = "response/shortened_url_response.html" + private const val DELETED_V1_URL_RESPONSE = "response/video_deleted_v1.html" private const val CAPTCHA_REQUIRED_RESPONSE_ONE = "response/captcha_required_one.html" private const val CAPTCHA_REQUIRED_RESPONSE_TWO = "response/captcha_required_two.html" private const val MAIN_PAGE_VARIANT_1_RESPONSE = "response/main_page_v1.html" @@ -297,6 +311,9 @@ class TikTokDownloadRemoteSourceTest { readResourceFile(CAPTCHA_REQUIRED_RESPONSE_TWO) .replace("https://www.tiktok.com/@ieclauuu/video/6887614455967010049", CAPTCHA_TEST_URL) + private fun Any.readResourceFileDeletedV1UrlResponse() = + readResourceFile(DELETED_V1_URL_RESPONSE) + @JvmStatic private fun captchaResponses() = Stream.of( Arguments.of(CAPTCHA_REQUIRED_RESPONSE_ONE, readCaptchaOneResponse()), diff --git a/app/src/test/resources/response/video_deleted_v1.html b/app/src/test/resources/response/video_deleted_v1.html new file mode 100644 index 0000000..d26ed7d --- /dev/null +++ b/app/src/test/resources/response/video_deleted_v1.html @@ -0,0 +1,24 @@ + + + + + + TikTok - Make Your Day + + + + + + + +
+ +
+ + + + \ No newline at end of file