Fix handling network error
This commit is contained in:
@@ -8,9 +8,11 @@ from ... import config
|
||||
from ... paramgen import arcparam
|
||||
from ... exceptions import UnknownConnectionError
|
||||
from concurrent.futures import CancelledError
|
||||
from httpx import NetworkError, ReadTimeout
|
||||
from json import JSONDecodeError
|
||||
from urllib.parse import quote
|
||||
|
||||
|
||||
headers = config.headers
|
||||
REPLAY_URL = "https://www.youtube.com/live_chat_replay/" \
|
||||
"get_live_chat_replay?continuation="
|
||||
@@ -66,6 +68,7 @@ def ready_blocks(video_id, duration, div, callback):
|
||||
async def _create_block(session, video_id, seektime, callback):
|
||||
continuation = arcparam.getparam(video_id, seektime=seektime)
|
||||
url = f"{REPLAY_URL}{quote(continuation)}&pbj=1"
|
||||
err = None
|
||||
for _ in range(MAX_RETRY_COUNT):
|
||||
try:
|
||||
if continuation in param_set:
|
||||
@@ -77,9 +80,12 @@ def ready_blocks(video_id, duration, div, callback):
|
||||
break
|
||||
except JSONDecodeError:
|
||||
await asyncio.sleep(3)
|
||||
except (NetworkError, ReadTimeout) as e:
|
||||
err = e
|
||||
await asyncio.sleep(3)
|
||||
else:
|
||||
cancel()
|
||||
raise UnknownConnectionError("Abort: Unknown connection error.")
|
||||
raise UnknownConnectionError("Abort:" + str(err))
|
||||
|
||||
if actions:
|
||||
first = parser.get_offset(actions[0])
|
||||
@@ -118,6 +124,7 @@ def fetch_patch(callback, blocks, video_id):
|
||||
|
||||
async def _fetch(continuation, session) -> Patch:
|
||||
url = f"{REPLAY_URL}{quote(continuation)}&pbj=1"
|
||||
err = None
|
||||
for _ in range(MAX_RETRY_COUNT):
|
||||
try:
|
||||
if continuation in param_set:
|
||||
@@ -129,9 +136,12 @@ def fetch_patch(callback, blocks, video_id):
|
||||
break
|
||||
except JSONDecodeError:
|
||||
await asyncio.sleep(3)
|
||||
except (NetworkError, ReadTimeout) as e:
|
||||
err = e
|
||||
await asyncio.sleep(3)
|
||||
else:
|
||||
cancel()
|
||||
raise UnknownConnectionError("Abort: Unknown connection error.")
|
||||
raise UnknownConnectionError("Abort:" + str(err))
|
||||
|
||||
if actions:
|
||||
last = parser.get_offset(actions[-1])
|
||||
|
||||
@@ -93,4 +93,5 @@ class Extractor:
|
||||
return ret
|
||||
|
||||
def cancel(self):
|
||||
print("cancel")
|
||||
asyncdl.cancel()
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import httpx
|
||||
import json
|
||||
import re
|
||||
import httpx
|
||||
import time
|
||||
from httpx import ConnectError, NetworkError
|
||||
from .. import config
|
||||
from ..exceptions import InvalidVideoIdException, PatternUnmatchError
|
||||
from ..exceptions import InvalidVideoIdException, PatternUnmatchError, UnknownConnectionError
|
||||
from ..util.extract_video_id import extract_video_id
|
||||
|
||||
|
||||
headers = config.headers
|
||||
|
||||
pattern = re.compile(r"'PLAYER_CONFIG': ({.*}}})")
|
||||
@@ -85,8 +88,18 @@ class VideoInfo:
|
||||
|
||||
def _get_page_text(self, video_id):
|
||||
url = f"https://www.youtube.com/embed/{video_id}"
|
||||
resp = httpx.get(url, headers=headers)
|
||||
resp.raise_for_status()
|
||||
err = None
|
||||
for _ in range(3):
|
||||
try:
|
||||
resp = httpx.get(url, headers=headers)
|
||||
resp.raise_for_status()
|
||||
break
|
||||
except (ConnectError, NetworkError) as e:
|
||||
err = e
|
||||
time.sleep(3)
|
||||
else:
|
||||
raise UnknownConnectionError(str(err))
|
||||
|
||||
return resp.text
|
||||
|
||||
def _parse(self, text):
|
||||
|
||||
Reference in New Issue
Block a user