|
15 | 15 | """ |
16 | 16 |
|
17 | 17 | import os |
| 18 | +import time |
18 | 19 | import uuid |
19 | 20 | from copy import deepcopy |
20 | 21 | from pathlib import Path |
|
32 | 33 |
|
33 | 34 | from fastdeploy.multimodal.image import ImageMediaIO |
34 | 35 | from fastdeploy.multimodal.video import VideoMediaIO |
| 36 | +from fastdeploy.utils import api_server_logger |
35 | 37 |
|
36 | 38 |
|
37 | 39 | class VideoURL(TypedDict, total=False): |
@@ -90,12 +92,32 @@ def parse_video(self, video_url): |
90 | 92 | """Parse Video""" |
91 | 93 | return self.load_from_url(video_url, self.video_io) |
92 | 94 |
|
| 95 | + def http_get_with_retry(self, url, max_retries=3, retry_delay=1, backoff_factor=2): |
| 96 | + """HTTP GET retry""" |
| 97 | + |
| 98 | + retry_cnt = 0 |
| 99 | + delay = retry_delay |
| 100 | + |
| 101 | + while retry_cnt < max_retries: |
| 102 | + try: |
| 103 | + response = requests.get(url) |
| 104 | + response.raise_for_status() |
| 105 | + return response.content |
| 106 | + except Exception as e: |
| 107 | + retry_cnt += 1 |
| 108 | + if retry_cnt >= max_retries: |
| 109 | + api_server_logger.error(f"HTTP GET failed: {e}. Max retries reached") |
| 110 | + raise |
| 111 | + api_server_logger.info(f"HTTP GET failed: {e}. Start retry {retry_cnt}") |
| 112 | + time.sleep(delay) |
| 113 | + delay *= backoff_factor |
| 114 | + |
93 | 115 | def load_from_url(self, url, media_io): |
94 | 116 | """Load media from URL""" |
95 | 117 |
|
96 | 118 | parsed = urlparse(url) |
97 | 119 | if parsed.scheme.startswith("http"): |
98 | | - media_bytes = requests.get(url).content |
| 120 | + media_bytes = self.http_get_with_retry(url) |
99 | 121 | return media_io.load_bytes(media_bytes) |
100 | 122 |
|
101 | 123 | if parsed.scheme.startswith("data"): |
|
0 commit comments