Update app.py
Browse files
app.py
CHANGED
|
@@ -34,7 +34,7 @@ tokens = [
|
|
| 34 |
|
| 35 |
|
| 36 |
async def download_png(url: str, folder: str, client: AsyncClient, retries: int = 5) -> Path:
|
| 37 |
-
|
| 38 |
for attempt in range(retries):
|
| 39 |
try:
|
| 40 |
response = await client.get(url)
|
|
@@ -52,12 +52,11 @@ async def download_png(url: str, folder: str, client: AsyncClient, retries: int
|
|
| 52 |
|
| 53 |
async def download_pngs(urls: str | list[str]) -> list[Any]:
|
| 54 |
urls = [urls] if isinstance(urls, str) else urls
|
| 55 |
-
logger.info(f'скачивается список список из {len(urls)}: {urls}')
|
| 56 |
print(f'скачивается список список из {len(urls)}: {urls}')
|
| 57 |
# бот coze имеет баг, и из воркфлоу прибавляет предыдущий ответ к ссылкам, если включен контекст чата:
|
| 58 |
valid_urls = [url for url in urls if url and '\n' not in url and '\\n' not in url and url.strip() != '']
|
| 59 |
if len(valid_urls) != len(urls):
|
| 60 |
-
|
| 61 |
async with AsyncClient(verify=False, follow_redirects=True, timeout=30.0) as client:
|
| 62 |
tasks = [download_png(url, str(uuid4()), client) for url in valid_urls]
|
| 63 |
return list(await gather(*tasks))
|
|
@@ -65,7 +64,7 @@ async def download_pngs(urls: str | list[str]) -> list[Any]:
|
|
| 65 |
|
| 66 |
async def optimize_png(image_path: Path, retries: int = 3) -> None:
|
| 67 |
command = f'{oxipng_bin.resolve()} --opt 2 --strip safe --out {image_path} {image_path}'
|
| 68 |
-
|
| 69 |
for attempt in range(retries):
|
| 70 |
try:
|
| 71 |
process = await create_subprocess_shell(command, stdout=PIPE, stderr=PIPE)
|
|
@@ -75,7 +74,7 @@ async def optimize_png(image_path: Path, retries: int = 3) -> None:
|
|
| 75 |
else:
|
| 76 |
raise CalledProcessError(process.returncode, command, output=stdout, stderr=stderr)
|
| 77 |
except CalledProcessError as e:
|
| 78 |
-
|
| 79 |
if attempt < retries - 1:
|
| 80 |
await sleep(2 ** attempt)
|
| 81 |
else:
|
|
@@ -83,7 +82,7 @@ async def optimize_png(image_path: Path, retries: int = 3) -> None:
|
|
| 83 |
|
| 84 |
|
| 85 |
async def convert_to_jpeg(image_path: Path) -> Path:
|
| 86 |
-
|
| 87 |
try:
|
| 88 |
image = Image.open(image_path)
|
| 89 |
output_path = image_path.with_suffix('.jpg')
|
|
@@ -91,20 +90,20 @@ async def convert_to_jpeg(image_path: Path) -> Path:
|
|
| 91 |
image_path.unlink(missing_ok=True)
|
| 92 |
return output_path
|
| 93 |
except:
|
| 94 |
-
|
| 95 |
return image_path
|
| 96 |
|
| 97 |
|
| 98 |
async def convert_to_jpegs(image_paths: list[str | Path] | str | Path) -> tuple[Path]:
|
| 99 |
image_paths = [Path(image_file) for image_file in ([image_paths] if not isinstance(image_paths, list) else image_paths)]
|
| 100 |
-
|
| 101 |
tasks = [convert_to_jpeg(image_path) for image_path in image_paths]
|
| 102 |
return await gather(*tasks)
|
| 103 |
|
| 104 |
|
| 105 |
async def optimize_pngs(image_paths: list[str | Path] | str | Path) -> None:
|
| 106 |
image_paths = [Path(image_file) for image_file in ([image_paths] if not isinstance(image_paths, list) else image_paths)]
|
| 107 |
-
|
| 108 |
tasks = [optimize_png(image_path) for image_path in image_paths]
|
| 109 |
await gather(*tasks)
|
| 110 |
|
|
@@ -132,7 +131,7 @@ async def upload_image(file_path: Path | str, file_type: str = 'png') -> str | N
|
|
| 132 |
|
| 133 |
async def optimize_and_upload(images_urls: list[str] | str, convert: bool = False) -> list[str]:
|
| 134 |
images_urls = [images_urls] if isinstance(images_urls, str) else images_urls
|
| 135 |
-
|
| 136 |
images_paths = await download_pngs(images_urls)
|
| 137 |
if not convert:
|
| 138 |
await optimize_pngs(images_paths)
|
|
@@ -142,16 +141,16 @@ async def optimize_and_upload(images_urls: list[str] | str, convert: bool = Fals
|
|
| 142 |
new_url = await upload_image(image_path, 'png' if not convert else 'jpeg')
|
| 143 |
if new_url:
|
| 144 |
new_images_urls.append(new_url)
|
| 145 |
-
|
| 146 |
try:
|
| 147 |
image_path.unlink()
|
| 148 |
except Exception as e:
|
| 149 |
-
|
| 150 |
-
|
| 151 |
try:
|
| 152 |
rmtree(images_paths[0].parent)
|
| 153 |
except Exception as e:
|
| 154 |
-
|
| 155 |
return new_images_urls
|
| 156 |
|
| 157 |
|
|
|
|
| 34 |
|
| 35 |
|
| 36 |
async def download_png(url: str, folder: str, client: AsyncClient, retries: int = 5) -> Path:
|
| 37 |
+
print(f'загрузка изображения: {url}')
|
| 38 |
for attempt in range(retries):
|
| 39 |
try:
|
| 40 |
response = await client.get(url)
|
|
|
|
| 52 |
|
| 53 |
async def download_pngs(urls: str | list[str]) -> list[Any]:
|
| 54 |
urls = [urls] if isinstance(urls, str) else urls
|
|
|
|
| 55 |
print(f'скачивается список список из {len(urls)}: {urls}')
|
| 56 |
# бот coze имеет баг, и из воркфлоу прибавляет предыдущий ответ к ссылкам, если включен контекст чата:
|
| 57 |
valid_urls = [url for url in urls if url and '\n' not in url and '\\n' not in url and url.strip() != '']
|
| 58 |
if len(valid_urls) != len(urls):
|
| 59 |
+
print(f'некорректные ссылки удалены из списка: {set(urls) - set(valid_urls)}')
|
| 60 |
async with AsyncClient(verify=False, follow_redirects=True, timeout=30.0) as client:
|
| 61 |
tasks = [download_png(url, str(uuid4()), client) for url in valid_urls]
|
| 62 |
return list(await gather(*tasks))
|
|
|
|
| 64 |
|
| 65 |
async def optimize_png(image_path: Path, retries: int = 3) -> None:
|
| 66 |
command = f'{oxipng_bin.resolve()} --opt 2 --strip safe --out {image_path} {image_path}'
|
| 67 |
+
print(f'оптимизация картинки {image_path}')
|
| 68 |
for attempt in range(retries):
|
| 69 |
try:
|
| 70 |
process = await create_subprocess_shell(command, stdout=PIPE, stderr=PIPE)
|
|
|
|
| 74 |
else:
|
| 75 |
raise CalledProcessError(process.returncode, command, output=stdout, stderr=stderr)
|
| 76 |
except CalledProcessError as e:
|
| 77 |
+
print(f'ошибка при оптимизации {image_path}')
|
| 78 |
if attempt < retries - 1:
|
| 79 |
await sleep(2 ** attempt)
|
| 80 |
else:
|
|
|
|
| 82 |
|
| 83 |
|
| 84 |
async def convert_to_jpeg(image_path: Path) -> Path:
|
| 85 |
+
print(f'конвертируется {image_path}')
|
| 86 |
try:
|
| 87 |
image = Image.open(image_path)
|
| 88 |
output_path = image_path.with_suffix('.jpg')
|
|
|
|
| 90 |
image_path.unlink(missing_ok=True)
|
| 91 |
return output_path
|
| 92 |
except:
|
| 93 |
+
print(f'ошибка при конвертации {image_path}')
|
| 94 |
return image_path
|
| 95 |
|
| 96 |
|
| 97 |
async def convert_to_jpegs(image_paths: list[str | Path] | str | Path) -> tuple[Path]:
|
| 98 |
image_paths = [Path(image_file) for image_file in ([image_paths] if not isinstance(image_paths, list) else image_paths)]
|
| 99 |
+
print(f'оптимизируется список список из {len(image_paths)}: {image_paths}')
|
| 100 |
tasks = [convert_to_jpeg(image_path) for image_path in image_paths]
|
| 101 |
return await gather(*tasks)
|
| 102 |
|
| 103 |
|
| 104 |
async def optimize_pngs(image_paths: list[str | Path] | str | Path) -> None:
|
| 105 |
image_paths = [Path(image_file) for image_file in ([image_paths] if not isinstance(image_paths, list) else image_paths)]
|
| 106 |
+
print(f'оптимизируется список список из {len(image_paths)}: {image_paths}')
|
| 107 |
tasks = [optimize_png(image_path) for image_path in image_paths]
|
| 108 |
await gather(*tasks)
|
| 109 |
|
|
|
|
| 131 |
|
| 132 |
async def optimize_and_upload(images_urls: list[str] | str, convert: bool = False) -> list[str]:
|
| 133 |
images_urls = [images_urls] if isinstance(images_urls, str) else images_urls
|
| 134 |
+
print(f'принятые ссылки в обработку ({len(images_urls)}): {images_urls}')
|
| 135 |
images_paths = await download_pngs(images_urls)
|
| 136 |
if not convert:
|
| 137 |
await optimize_pngs(images_paths)
|
|
|
|
| 141 |
new_url = await upload_image(image_path, 'png' if not convert else 'jpeg')
|
| 142 |
if new_url:
|
| 143 |
new_images_urls.append(new_url)
|
| 144 |
+
print(f'загружено изображение {image_path} в {new_url}')
|
| 145 |
try:
|
| 146 |
image_path.unlink()
|
| 147 |
except Exception as e:
|
| 148 |
+
print(f'не удалось удалить файл {image_path}: {e}')
|
| 149 |
+
print(f'новые ссылки: ({len(new_images_urls)}): {new_images_urls}')
|
| 150 |
try:
|
| 151 |
rmtree(images_paths[0].parent)
|
| 152 |
except Exception as e:
|
| 153 |
+
print(f'не удалось удалить файл {images_paths[0].parent}: {e}')
|
| 154 |
return new_images_urls
|
| 155 |
|
| 156 |
|