返回提交历史
Modified
g4f/Provider/needs_auth/Video.py
+10
-5
Modified
g4f/api/__init__.py
+12
-6
Modified
g4f/gui/server/api.py
+10
-1
Modified
g4f/image/copy_images.py
+5
-3
XFEstudio/gpt4free
Support timeout in backend_api
9f941ae7
代码差异
4 个文件
+37
-15
@@ -110,6 +110,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
110
110
yield VideoResponse(str(response.url), prompt)
111
111
return
112
112
raise MissingRequirementsError("Video provider requires a browser to be installed.")
113
page = None
113
114
try:
114
115
yield ContinueResponse("Timeout waiting for Video URL")
115
116
page = await browser.get(cls.urls[model].format(quote(prompt)))
@@ -128,16 +129,20 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
128
129
for key, value in event.request.headers.items():
129
130
RequestConfig.headers[key.lower()] = value
130
131
RequestConfig.urls[prompt].append(event.request.url)
131
await page.send(nodriver.cdp.network.enable())
132
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
133
if model == "search":
134
for _ in range(5):
135
await page.scroll_down(50)
132
if page is not None:
133
await page.send(nodriver.cdp.network.enable())
134
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
135
if model == "search":
136
for _ in range(5):
137
await page.scroll_down(50)
138
await asyncio.sleep(1)
136
139
response = await RequestConfig.get_response(prompt)
137
140
if response:
138
141
yield Reasoning(label="Found", status="")
139
142
yield response
140
143
return
144
if page is None:
145
raise RuntimeError("Failed to open page or get response.")
141
146
try:
142
147
await asyncio.sleep(3)
143
148
await page.select("textarea", 240)
@@ -5,6 +5,7 @@ import json
5
5
import uvicorn
6
6
import secrets
7
7
import os
8
import re
8
9
import shutil
9
10
from email.utils import formatdate
10
11
import os.path
@@ -703,6 +704,12 @@ class Api:
703
704
HTTP_404_NOT_FOUND: {}
704
705
})
705
706
async def get_media(filename, request: Request, thumbnail: bool = False):
707
def get_timestamp(str):
708
m=re.match("^[0-9]+", str)
709
if m:
710
return int(m.group(0))
711
else:
712
raise ValueError("No timestamp found in filename")
706
713
target = os.path.join(get_media_dir(), os.path.basename(filename))
707
714
if thumbnail and has_pillow:
708
715
thumbnail_dir = os.path.join(get_media_dir(), "thumbnails")
@@ -713,14 +720,13 @@ class Api:
713
720
target = other_name
714
721
ext = os.path.splitext(filename)[1][1:]
715
722
mime_type = EXTENSIONS_MAP.get(ext)
723
stat_result = SimpleNamespace()
724
stat_result.st_size = 0
725
stat_result.st_mtime = get_timestamp(filename)
716
726
if thumbnail and has_pillow and os.path.isfile(thumbnail):
717
stat_result = os.stat(thumbnail)
727
stat_result.st_size = os.stat(thumbnail).st_size
718
728
elif not thumbnail and os.path.isfile(target):
719
stat_result = os.stat(target)
720
else:
721
stat_result = SimpleNamespace()
722
stat_result.st_size = 0
723
stat_result.st_mtime = 0
729
stat_result.st_size = os.stat(target).st_size
724
730
headers = {
725
731
"cache-control": "public, max-age=31536000",
726
732
"last-modified": formatdate(stat_result.st_mtime, usegmt=True),
@@ -199,7 +199,16 @@ class Api:
199
199
chunk.alt = format_media_prompt(kwargs.get("messages"), chunk.alt)
200
200
width, height = get_width_height(chunk.get("width"), chunk.get("height"))
201
201
tags = [model, kwargs.get("aspect_ratio"), kwargs.get("resolution")]
202
media = asyncio.run(copy_media(chunk.get_list(), chunk.get("cookies"), chunk.get("headers"), proxy=proxy, alt=chunk.alt, tags=tags, add_url=f"width={width}&height={height}&"))
202
media = asyncio.run(copy_media(
203
chunk.get_list(),
204
chunk.get("cookies"),
205
chunk.get("headers"),
206
proxy=proxy,
207
alt=chunk.alt,
208
tags=tags,
209
add_url=f"width={width}&height={height}&",
210
timeout=kwargs.get("timeout"),
211
))
203
212
media = ImageResponse(media, chunk.alt) if isinstance(chunk, ImageResponse) else VideoResponse(media, chunk.alt)
204
213
yield self._format_json("content", str(media), urls=media.urls, alt=media.alt)
205
214
elif isinstance(chunk, SynthesizeData):
@@ -7,8 +7,8 @@ import hashlib
7
7
import base64
8
8
from datetime import datetime
9
9
from typing import AsyncIterator
10
from urllib.parse import quote, unquote
11
from aiohttp import ClientSession, ClientError
10
from urllib.parse import quote
11
from aiohttp import ClientSession, ClientError, ClientTimeout
12
12
from urllib.parse import urlparse
13
13
14
14
from ..typing import Optional, Cookies, Union
@@ -117,7 +117,8 @@ async def copy_media(
117
117
tags: list[str] = None,
118
118
add_url: Union[bool, str] = True,
119
119
target: str = None,
120
ssl: bool = None
120
ssl: bool = None,
121
timeout: Optional[int] = None
121
122
) -> list[str]:
122
123
"""
123
124
Download and store images locally with Unicode-safe filenames
@@ -131,6 +132,7 @@ async def copy_media(
131
132
connector=get_connector(proxy=proxy),
132
133
cookies=cookies,
133
134
headers=headers,
135
timeout=ClientTimeout(total=timeout) if timeout else None,
134
136
) as session:
135
137
async def copy_image(image: str, target: str = None) -> str:
136
138
"""Process individual image and return its local URL"""