Fred808 commited on
Commit
687a486
·
verified ·
1 Parent(s): 8ccfb1e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -0
app.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ import requests
4
+ from urllib.parse import urlparse
5
+ from huggingface_hub import upload_file
6
+ from fastapi import FastAPI
7
+ from contextlib import asynccontextmanager
8
+ import asyncio
9
+ import logging
10
+
11
+ # === CONFIGURATION ===
12
+ HF_TOKEN = os.environ.get("HF_TOKEN")
13
+ REPO_ID = "Fred808/BG1"
14
+ DATA_PATH = "Blenders"
15
+ OUTPUT_DIR = "batch_downloads"
16
+ DOWNLOAD_URLS = [
17
+ "https://ww6.zeroupload.xyz/46d9a9c22fb4dce9751cedb1783c0148/CreativeShrimp_CinematicLightingBlender_DownloadPirate.com.rar?download_token=6a3eefda9249d464ca20c931bfdd51b4b548a575785abed7cecb486f40569840",
18
+ "https://ww1.zeroupload.xyz/bd78d882efe14fa9cfa26814a502bb54/MDS_BlenderWorkout_DownloadPirate.com.rar?download_token=c8dc52e243a9cebebf94a515aad7725c7fe4ecb08d073c885c3a142828c6ea9c",
19
+ "https://ww2.zeroupload.xyz/2d8f4e87b9a997f820c8b7d5a36e4824/Wingfox_BlenderAnimationandSimulationMadeEasy2022_DownloadPirate.com.rar?download_token=abe3626e76a306a2e5dcbf8298126e8f7972b0173d0bf9dc7ba3cc717d22bd23",
20
+ "https://ww7.zeroupload.xyz/87dd33ecc236554d0c6c2816694a4faa/CGCookie_AnimatingFirstPersonCharacterWeapons_DownloadPirate.com_(2).rar?download_token=fba59775b168ee3558cb5c05f136f92560fff431dc33ce5103fee75168a9dd23",
21
+ "https://ww2.zeroupload.xyz/a0b8278ebb33a990e12d3ea6370a61df/CGCookieCreatingStylized3DForestEnvironmentBlender_DownloadPIrate.com.rar?download_token=7a214eead8ad08209d182b9ee823343774500d124c3db246cd611c17ba510329",
22
+ "https://ww2.zeroupload.xyz/6b6389fb853b6572b55b5e77234ee1dc/Polygon_Create3DLetteringBlender_DownloadPirate.com.rar?download_token=22818daa8ce69123d06845b8c7d801cdb33649d0ebb78ced416c1f82815f4b0c",
23
+ "https://ww2.zeroupload.xyz/e1476317b8a49c057a413adb5a893837/ChocofurInteriorVisualizationSecretsinBlender2021_DownloadPirate.com.part1.rar?download_token=f9ca558379e097883670b4aaf3f1f00354d4a338d17fe1ac68c56c004819843f",
24
+ "https://ww2.zeroupload.xyz/e1476317b8a49c057a413adb5a893837/ChocofurInteriorVisualizationSecretsinBlender2021_DownloadPirate.com.part1.rar?download_token=ebdca39c20da6329be4aa785ab0655ca105ca778a73142c23c0059981a99c490",
25
+ "https://ww2.zeroupload.xyz/09ef0a1b9ad0490815b58292f0047962/ChocofurInteriorVisualizationSecretsinBlender2021_DownloadPirate.com.part2.rar?download_token=3ab49b9370e5d0bd6f6a053e9ec818353afdf8b211671c239d6b8c1455da9f2e",
26
+ "https://ww2.zeroupload.xyz/fbe2c5df639f3bd583a59b05e52af208/ChocofurInteriorVisualizationSecretsinBlender2021_DownloadPirate.com.part3.rar?download_token=aeb2de8e4c0bb3402f2f51778fe4843274d73af68f92f68f207b7875a2d47dee",
27
+ "https://ww2.zeroupload.xyz/a361e6297ba484f7466723e5865ccc75/Skillshare_186826694_DownloadPirate.com.rar?download_token=69913dfca229c55df45089a8d19336aa5aec6f0258a6a503ee8d1db7e4291133",
28
+ "https://ww2.zeroupload.xyz/a361e6297ba484f7466723e5865ccc75/Skillshare_186826694_DownloadPirate.com.rar?download_token=a671fed2bf573fedbcb5f2e10d1d197603a5d843078b05a795f299a1e1b26321",
29
+ "https://ww6.zeroupload.xyz/83e9d12c9e7c9b493ed14dff70ae1e66/BlenderLaunchPad_DownloadPirate.com.part1.rar?download_token=1aeb9e8d9ba8b2098d803d1d96afdd6c867a8f9b06d7c659b86a4ed8d0a65656",
30
+ "https://ww6.zeroupload.xyz/7ce51dc0e5d450f2fd95a453a799d514/BlenderLaunchPad_DownloadPirate.com.part2.rar?download_token=01749ac71c41e94bc6217a57bdfeeae6a85ad10af14c179da598dbe6d10bcd29",
31
+ "https://ww6.zeroupload.xyz/f9b58e92aab19a26a3d3c5b24d734c40/BlenderLaunchPad_DownloadPirate.com.part3.rar?download_token=529f95bf4fc489936140cd7f19f71b055ac5e4bc8189a86910a650d3d418c1a1",
32
+ "https://ww6.zeroupload.xyz/d6d34ba916295d15826814b6500d25e9/BlenderLaunchPad_DownloadPirate.com.part4.rar?download_token=71eb49f728ee2096211102b585bd61b734dc9e407c3978a899a44084ee277a46",
33
+ "https://ww6.zeroupload.xyz/47d84f6747b573260262be6a3b798e6b/BlenderLaunchPad_DownloadPirate.com.part5.rar?download_token=2052c643a382361fe5cb7f117039bf6a491de01b0dd8121a0fe281cf80a08323"
34
+
35
+ ]
36
+ DELAY_BETWEEN_DOWNLOADS = 12 # seconds
37
+
38
+ # === Setup Logging ===
39
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
40
+
41
+ # === Prepare output folder ===
42
+ os.makedirs(OUTPUT_DIR, exist_ok=True)
43
+
44
+ app = FastAPI()
45
+
46
+ # === DUMMY ROUTE TO KEEP SERVER HEALTHY ===
47
+ @app.get("/")
48
+ def keep_alive():
49
+ return {"status": "running"}
50
+
51
+ # === Upload Function ===
52
+ def upload_to_dataset(filepath):
53
+ try:
54
+ upload_file(
55
+ path_or_fileobj=filepath,
56
+ path_in_repo=f"{DATA_PATH}/{os.path.basename(filepath)}",
57
+ repo_id=REPO_ID,
58
+ repo_type="dataset",
59
+ token=HF_TOKEN
60
+ )
61
+ logging.info(f"[↑] Uploaded: {filepath}")
62
+ except Exception as e:
63
+ logging.error(f"[!] Upload failed: {filepath} — {e}")
64
+
65
+ # === Background Worker ===
66
+ async def downloader_worker():
67
+ for direct_download_link in DOWNLOAD_URLS:
68
+ logging.info("[*] Waiting before next download...")
69
+ await asyncio.sleep(DELAY_BETWEEN_DOWNLOADS)
70
+
71
+ try:
72
+ logging.info(f"[*] Downloading from: {direct_download_link}")
73
+ filename = os.path.basename(urlparse(direct_download_link).path)
74
+ if not filename or "." not in filename:
75
+ filename = "downloaded_file_" + str(int(time.time()))
76
+
77
+ local_path = os.path.join(OUTPUT_DIR, filename)
78
+ logging.info(f"[*] Saving to: {local_path}")
79
+
80
+ with requests.get(direct_download_link, stream=True) as r:
81
+ r.raise_for_status()
82
+ with open(local_path, "wb") as f:
83
+ for chunk in r.iter_content(chunk_size=8192):
84
+ f.write(chunk)
85
+
86
+ logging.info(f"[✓] Downloaded: {filename}")
87
+ upload_to_dataset(local_path)
88
+ os.remove(local_path)
89
+
90
+ except Exception as e:
91
+ logging.error(f"[!] Error with {direct_download_link}: {e}")
92
+
93
+ logging.info("✅ All files processed.")
94
+
95
+ @app.get("/")
96
+ def stay_alive():
97
+ return {"msg": "Running"}
98
+
99
+ @app.get("/health")
100
+ def healthcheck():
101
+ return {"healthy": True}
102
+
103
+ # === FastAPI Lifespan ===
104
+ @asynccontextmanager
105
+ async def lifespan(app: FastAPI):
106
+ logging.info("🚀 Starting FastAPI download-uploader microservice...")
107
+ task = asyncio.create_task(downloader_worker())
108
+ yield
109
+ task.cancel()
110
+ logging.info("🛑 Shutting down microservice.")
111
+
112
+ # === FastAPI App ===
113
+ app = FastAPI(lifespan=lifespan)
114
+ # Re-assign app with lifespan logic
115
+ app.router.lifespan_context = lifespan