chat / app /services /download_media.py
ariansyahdedy's picture
Add Gemnini Flash
07fbc67
raw
history blame
6.03 kB
import aiohttp
import asyncio
from typing import Optional
import aiohttp
import logging
from typing import Optional
logger = logging.getLogger(__name__)
import aiohttp
import aiofiles
import logging
import os
from typing import Optional
logger = logging.getLogger(__name__)
async def download_whatsapp_media(media_id: str, access_token: str, file_path: Optional[str] = None) -> Optional[str]:
"""
Asynchronously download media from WhatsApp Cloud API using media ID and save it to a file.
Args:
media_id (str): The ID of the media to download.
access_token (str): Your WhatsApp access token.
file_path (Optional[str]): The path where the media file should be saved.
Returns:
str: The file path if the media is saved successfully.
None: If download fails.
"""
timeout = aiohttp.ClientTimeout(total=30) # Set an appropriate timeout
async with aiohttp.ClientSession(timeout=timeout) as session:
# Step 1: Get the media URL
try:
url = f"https://graph.facebook.com/v21.0/{media_id}"
headers = {
"Authorization": f"Bearer {access_token}"
}
async with session.get(url, headers=headers) as response:
data = await response.json()
if response.status != 200:
logger.error(f"Failed to get media URL. Status: {response.status}, Response: {data}")
return None
media_url = data.get('url')
if not media_url:
logger.error(f"Failed to get media URL from response: {data}")
return None
except aiohttp.ClientError as e:
logger.error(f"Error getting media URL: {e}")
return None
except Exception as e:
logger.error(f"Unexpected error: {e}")
return None
# Step 2: Download the actual media
try:
headers = {
"Authorization": f"Bearer {access_token}"
}
async with session.get(media_url, headers=headers) as media_response:
if media_response.status != 200:
media_data = await media_response.text()
logger.error(f"Failed to download media. Status: {media_response.status}, Response: {media_data}")
return None
if file_path:
# Ensure the directory exists
os.makedirs("user_media", exist_ok=True)
file_path = os.path.join("user_media", file_path)
# Write the media content to the file asynchronously
async with aiofiles.open(file_path, 'wb') as f:
async for chunk in media_response.content.iter_chunked(1024):
await f.write(chunk)
return file_path
else:
logger.error("File path not provided for saving the media.")
return None
except aiohttp.ClientError as e:
logger.error(f"Error downloading media: {e}")
return None
except Exception as e:
logger.error(f"Error saving media to file: {e}")
return None
# async def download_whatsapp_media(media_id: str, access_token: str) -> Optional[bytes]:
# """
# Asynchronously download media from WhatsApp Cloud API using media ID
# Args:
# media_id (str): The ID of the media to download
# access_token (str): Your WhatsApp access token
# Returns:
# bytes: The media content if successful
# None: If download fails
# """
# headers = {
# "Authorization": f"Bearer {access_token}"
# }
# async with aiohttp.ClientSession() as session:
# try:
# # Step 1: Get the media URL
# url = f"https://graph.facebook.com/v21.0/{media_id}"
# async with session.get(url, headers=headers) as response:
# if response.status != 200:
# print(f"Failed to get media URL. Status: {response.status}")
# return None
# data = await response.json()
# media_url = data.get('url')
# if not media_url:
# print("Failed to get media URL from response")
# return None
# # Step 2: Download the actual media
# async with session.get(media_url, headers=headers) as media_response:
# if media_response.status != 200:
# print(f"Failed to download media. Status: {media_response.status}")
# return None
# return await media_response.read()
# # Step 3: Save the media to a file
# except aiohttp.ClientError as e:
# print(f"Error downloading media: {e}")
# return None
async def save_whatsapp_image(media_id: str, access_token: str, output_path: str) -> None:
"""
Asynchronously download and save WhatsApp image to file
Args:
media_id (str): The ID of the media to download
access_token (str): Your WhatsApp access token
output_path (str): Path where to save the image
"""
media_content = await download_whatsapp_media(media_id, access_token)
if media_content:
# File operations are blocking, so we use asyncio.to_thread for Python 3.9+
# For older Python versions, you might want to use loop.run_in_executor
await asyncio.to_thread(save_file, output_path, media_content)
print(f"Image saved to {output_path}")
else:
print("Failed to download image")
def save_file(path: str, content: bytes) -> None:
"""Helper function to save file content"""
with open(path, 'wb') as f:
f.write(content)