diff options
| author | Astounds <kirito@disroot.org> | 2026-03-22 21:25:57 -0500 |
|---|---|---|
| committer | Astounds <kirito@disroot.org> | 2026-03-22 21:25:57 -0500 |
| commit | 1f8c13adff30549a81ed388bd1c6cdaab6678a3c (patch) | |
| tree | cdcc5e83d65b532fa7be1c002ee50746a09e442b | |
| parent | 6a68f0664568cea6f9a12e8743f195fe0a41f3ce (diff) | |
| download | yt-local-1f8c13adff30549a81ed388bd1c6cdaab6678a3c.tar.lz yt-local-1f8c13adff30549a81ed388bd1c6cdaab6678a3c.tar.xz yt-local-1f8c13adff30549a81ed388bd1c6cdaab6678a3c.zip | |
feat: improve 429 handling with Tor support and clean CI
- Retry with new Tor identity on 429
- Improve error logging
- Remove .build.yml and .drone.yml
| -rw-r--r-- | .build.yml | 12 | ||||
| -rw-r--r-- | .drone.yml | 10 | ||||
| -rw-r--r-- | youtube/util.py | 12 |
3 files changed, 9 insertions, 25 deletions
diff --git a/.build.yml b/.build.yml deleted file mode 100644 index 47de52e..0000000 --- a/.build.yml +++ /dev/null @@ -1,12 +0,0 @@ -image: debian/buster -packages: - - python3-pip - - virtualenv -tasks: - - test: | - cd yt-local - virtualenv -p python3 venv - source venv/bin/activate - python --version - pip install -r requirements-dev.txt - pytest diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 188bf7c..0000000 --- a/.drone.yml +++ /dev/null @@ -1,10 +0,0 @@ -kind: pipeline -name: default - -steps: -- name: test - image: python:3.7.3 - commands: - - pip install --upgrade pip - - pip install -r requirements-dev.txt - - pytest diff --git a/youtube/util.py b/youtube/util.py index 2b3f43e..e6f1961 100644 --- a/youtube/util.py +++ b/youtube/util.py @@ -372,10 +372,16 @@ def fetch_url(url, headers=(), timeout=15, report_text=None, data=None, if not use_tor or not settings.route_tor: logger.warning(f'YouTube returned 429 but Tor is not enabled. Consider enabling Tor routing.') raise FetchError('429', reason=response.reason, ip=ip) + else: + # Tor is enabled but we've exhausted retries + logger.error(f'YouTube blocked request - Tor exit node overutilized after {max_retries} retries. Exit IP: {ip}') + raise FetchError('429', reason=response.reason, ip=ip, + error_message='Tor exit node overutilized after multiple retries') - logger.error(f'YouTube blocked request - Tor exit node overutilized. Exit IP: {ip}') + # For Tor: get new identity immediately on 429 + if use_tor and settings.route_tor: + logger.info(f'YouTube blocked request - Tor exit node overutilized. Exit IP: {ip}. Getting new identity...') - # get new identity error = tor_manager.new_identity(start_time) if error: raise FetchError( @@ -384,7 +390,7 @@ def fetch_url(url, headers=(), timeout=15, report_text=None, data=None, else: continue # retry with new identity - # Calculate delay with exponential backoff and jitter + # For non-Tor: exponential backoff delay = (base_delay * (2 ** attempt)) + random.uniform(0, 1) logger.info(f'Rate limited (429). Waiting {delay:.1f}s before retry {attempt + 1}/{max_retries}...') time.sleep(delay) |
