diff --git a/gallery_dl/extractor/tiktok.py b/gallery_dl/extractor/tiktok.py index 30f310d6..eaf942d1 100644 --- a/gallery_dl/extractor/tiktok.py +++ b/gallery_dl/extractor/tiktok.py @@ -6,6 +6,7 @@ """Extractors for https://www.tiktok.com/""" +from json.decoder import JSONDecodeError from .common import Extractor, Message from .. import text, util, ytdl, exception @@ -143,12 +144,22 @@ class TiktokExtractor(Extractor): def _sanitize_url(self, url): return text.ensure_http_scheme(url.replace("/photo/", "/video/", 1)) - def _extract_rehydration_data(self, url): - html = self.request(url).text - data = text.extr( - html, '') - return util.json_loads(data)["__DEFAULT_SCOPE__"] + def _extract_rehydration_data(self, url, *, retries=1): + try: + html = self.request(url).text + data = text.extr( + html, '') + return util.json_loads(data)["__DEFAULT_SCOPE__"] + except JSONDecodeError: + # We failed to retrieve rehydration data. This happens relatively + # frequently, so retry if we're told to do so. + self.log.warning("%s: Failed to retrieve rehydration data, trying " + "%d more time%s", url, retries, + "" if retries == 1 else "s") + if retries > 0: + return self._extract_rehydration_data(url, retries=retries-1) + raise def _extract_audio(self, post): audio = post["music"] @@ -179,7 +190,7 @@ class TiktokExtractor(Extractor): elif status == 10204: self.log.error("%s: Requested post not available", url) elif status == 10231: - self.log.error("%s: Region locked - Try downloading with a" + self.log.error("%s: Region locked - Try downloading with a " "VPN/proxy connection", url) else: self.log.error(