Spaces:
Paused
Paused
GitHub Actions Bot commited on
Commit ·
7efb4dc
1
Parent(s): 54f5453
Sync from GitHub main branch
Browse files
main.py
CHANGED
|
@@ -101,7 +101,6 @@ async def lifespan(app: FastAPI):
|
|
| 101 |
app.state.browser = browser
|
| 102 |
app.state.http_client = http_client
|
| 103 |
|
| 104 |
-
# SINGLE WORKER
|
| 105 |
app.state.worker_task = asyncio.create_task(screenshot_worker(app))
|
| 106 |
|
| 107 |
except Exception as e:
|
|
@@ -174,19 +173,19 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 174 |
page = None
|
| 175 |
|
| 176 |
try:
|
|
|
|
| 177 |
context = await browser.new_context(
|
| 178 |
-
viewport={"width":
|
| 179 |
-
device_scale_factor=
|
| 180 |
bypass_csp=True,
|
| 181 |
java_script_enabled=True,
|
| 182 |
)
|
| 183 |
page = await context.new_page()
|
| 184 |
|
| 185 |
-
#
|
| 186 |
async def route_handler(route):
|
| 187 |
try:
|
| 188 |
r = route.request
|
| 189 |
-
# Block only heavy/unused media (not fonts!)
|
| 190 |
if r.resource_type in ["video", "media"]:
|
| 191 |
await route.abort()
|
| 192 |
else:
|
|
@@ -205,6 +204,7 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 205 |
|
| 206 |
await page.evaluate(f"document.body.style.zoom = '{zoom_value}'")
|
| 207 |
|
|
|
|
| 208 |
last_height = -1
|
| 209 |
for _ in range(200):
|
| 210 |
height = await page.evaluate(
|
|
@@ -218,6 +218,7 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 218 |
break
|
| 219 |
last_height = height
|
| 220 |
|
|
|
|
| 221 |
await page.evaluate("""
|
| 222 |
const items = document.querySelectorAll('.megaListItem, .file-block-sc');
|
| 223 |
let i = 0;
|
|
@@ -251,7 +252,12 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 251 |
|
| 252 |
await page.wait_for_timeout(1200)
|
| 253 |
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
|
| 256 |
except Exception as e:
|
| 257 |
log.warning(f"Screenshot failed for {url}: {e}")
|
|
@@ -266,8 +272,9 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 266 |
except:
|
| 267 |
pass
|
| 268 |
|
|
|
|
| 269 |
try:
|
| 270 |
-
log.info(f"
|
| 271 |
|
| 272 |
with open(screenshot_path, "rb") as fh:
|
| 273 |
multipart = {"source": ("screenshot.jpg", fh, "image/jpeg")}
|
|
@@ -276,8 +283,6 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 276 |
|
| 277 |
payload = resp.json()
|
| 278 |
|
| 279 |
-
log.info(f"Upload done: {url}")
|
| 280 |
-
|
| 281 |
if payload.get("status_code") == 200:
|
| 282 |
return {"success": True, "url": payload["image"]["url"]}
|
| 283 |
|
|
@@ -289,7 +294,7 @@ async def capture_and_upload(url: str, zoom_value: float, browser: Browser, http
|
|
| 289 |
|
| 290 |
|
| 291 |
# ---------------------------------------------------------
|
| 292 |
-
# RUN
|
| 293 |
# ---------------------------------------------------------
|
| 294 |
|
| 295 |
if __name__ == "__main__":
|
|
|
|
| 101 |
app.state.browser = browser
|
| 102 |
app.state.http_client = http_client
|
| 103 |
|
|
|
|
| 104 |
app.state.worker_task = asyncio.create_task(screenshot_worker(app))
|
| 105 |
|
| 106 |
except Exception as e:
|
|
|
|
| 173 |
page = None
|
| 174 |
|
| 175 |
try:
|
| 176 |
+
# UPDATED: Higher viewport + high DPI = clearer text at same zoom
|
| 177 |
context = await browser.new_context(
|
| 178 |
+
viewport={"width": 2200, "height": 1400}, # Higher internal resolution
|
| 179 |
+
device_scale_factor=3, # HD clarity without heavy CPU
|
| 180 |
bypass_csp=True,
|
| 181 |
java_script_enabled=True,
|
| 182 |
)
|
| 183 |
page = await context.new_page()
|
| 184 |
|
| 185 |
+
# Do NOT block fonts or icons
|
| 186 |
async def route_handler(route):
|
| 187 |
try:
|
| 188 |
r = route.request
|
|
|
|
| 189 |
if r.resource_type in ["video", "media"]:
|
| 190 |
await route.abort()
|
| 191 |
else:
|
|
|
|
| 204 |
|
| 205 |
await page.evaluate(f"document.body.style.zoom = '{zoom_value}'")
|
| 206 |
|
| 207 |
+
# Scroll fully
|
| 208 |
last_height = -1
|
| 209 |
for _ in range(200):
|
| 210 |
height = await page.evaluate(
|
|
|
|
| 218 |
break
|
| 219 |
last_height = height
|
| 220 |
|
| 221 |
+
# Hover-effect load
|
| 222 |
await page.evaluate("""
|
| 223 |
const items = document.querySelectorAll('.megaListItem, .file-block-sc');
|
| 224 |
let i = 0;
|
|
|
|
| 252 |
|
| 253 |
await page.wait_for_timeout(1200)
|
| 254 |
|
| 255 |
+
# UPDATED: file size control + clarity
|
| 256 |
+
await page.screenshot(
|
| 257 |
+
path=screenshot_path,
|
| 258 |
+
type="jpeg",
|
| 259 |
+
quality=75 # Big size reduction, no visible clarity loss
|
| 260 |
+
)
|
| 261 |
|
| 262 |
except Exception as e:
|
| 263 |
log.warning(f"Screenshot failed for {url}: {e}")
|
|
|
|
| 272 |
except:
|
| 273 |
pass
|
| 274 |
|
| 275 |
+
# Upload
|
| 276 |
try:
|
| 277 |
+
log.info(f"Uploading screenshot for {url}")
|
| 278 |
|
| 279 |
with open(screenshot_path, "rb") as fh:
|
| 280 |
multipart = {"source": ("screenshot.jpg", fh, "image/jpeg")}
|
|
|
|
| 283 |
|
| 284 |
payload = resp.json()
|
| 285 |
|
|
|
|
|
|
|
| 286 |
if payload.get("status_code") == 200:
|
| 287 |
return {"success": True, "url": payload["image"]["url"]}
|
| 288 |
|
|
|
|
| 294 |
|
| 295 |
|
| 296 |
# ---------------------------------------------------------
|
| 297 |
+
# RUN
|
| 298 |
# ---------------------------------------------------------
|
| 299 |
|
| 300 |
if __name__ == "__main__":
|