Fix server freeze from unresponsive logo/image hosts
requests.get() calls had no timeout and ran directly on the aiohttp event loop, so a single dead logo host would hang for minutes and block every other request. Add timeouts and move logo downloads in get_logo to a thread executor so a slow/dead host no longer stalls the whole server. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
df36139bd5
commit
b16a0a811c
@@ -359,7 +359,7 @@ def make_xtream_series_channels(id_playlist, series_item, series_info, category_
|
|||||||
def save_image_from_url(url, save_path):
|
def save_image_from_url(url, save_path):
|
||||||
try:
|
try:
|
||||||
# Send a GET request to the URL
|
# Send a GET request to the URL
|
||||||
response = requests.get(url)
|
response = requests.get(url, timeout=10)
|
||||||
response.raise_for_status() # Raise an error for unsuccessful status codes
|
response.raise_for_status() # Raise an error for unsuccessful status codes
|
||||||
|
|
||||||
# Write the content of the response to a file
|
# Write the content of the response to a file
|
||||||
@@ -1059,7 +1059,7 @@ def get_image_urls(keyword, max_results=10):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Send the search request
|
# Send the search request
|
||||||
response = requests.get(search_url, headers=headers)
|
response = requests.get(search_url, headers=headers, timeout=10)
|
||||||
soup = BeautifulSoup(response.text, 'html.parser')
|
soup = BeautifulSoup(response.text, 'html.parser')
|
||||||
|
|
||||||
# Find image containers
|
# Find image containers
|
||||||
@@ -1096,14 +1096,14 @@ async def get_logo(request):
|
|||||||
if l :
|
if l :
|
||||||
url_logo = l['logo_url']
|
url_logo = l['logo_url']
|
||||||
print('url trouvée : ' + url_logo, flush=True)
|
print('url trouvée : ' + url_logo, flush=True)
|
||||||
save_image_from_url(url_logo, logo_channel_file_path)
|
await asyncio.get_running_loop().run_in_executor(None, save_image_from_url, url_logo, logo_channel_file_path)
|
||||||
query = { 'id_channel':id_channel}
|
query = { 'id_channel':id_channel}
|
||||||
update = { "$set": { "urlLogo": url_logo } }
|
update = { "$set": { "urlLogo": url_logo } }
|
||||||
collection_channels.update_one(query, update)
|
collection_channels.update_one(query, update)
|
||||||
else:
|
else:
|
||||||
print('url identifiee et sauvegarde du fichier : ' + url_logo, flush=True)
|
print('url identifiee et sauvegarde du fichier : ' + url_logo, flush=True)
|
||||||
if len(url_logo) > 0:
|
if len(url_logo) > 0:
|
||||||
save_image_from_url(url_logo, logo_channel_file_path)
|
await asyncio.get_running_loop().run_in_executor(None, save_image_from_url, url_logo, logo_channel_file_path)
|
||||||
|
|
||||||
image_data = None
|
image_data = None
|
||||||
if not os.path.exists(logo_channel_file_path):
|
if not os.path.exists(logo_channel_file_path):
|
||||||
@@ -1373,7 +1373,7 @@ async def download_epg(request):
|
|||||||
filename = data['filename']
|
filename = data['filename']
|
||||||
filepath = os.path.join(DOWNLOAD_EPG_DIR, filename)
|
filepath = os.path.join(DOWNLOAD_EPG_DIR, filename)
|
||||||
print('download file :', url, flush=True)
|
print('download file :', url, flush=True)
|
||||||
response = requests.get(url)
|
response = requests.get(url, timeout=10)
|
||||||
with open(filepath, 'wb') as f:
|
with open(filepath, 'wb') as f:
|
||||||
f.write(response.content)
|
f.write(response.content)
|
||||||
return web.json_response({'status':'ok'})
|
return web.json_response({'status':'ok'})
|
||||||
|
|||||||
Reference in New Issue
Block a user