Update app.py
Browse files
app.py
CHANGED
@@ -18,7 +18,7 @@ from collections import defaultdict
|
|
18 |
import time
|
19 |
from datetime import timedelta
|
20 |
import gc
|
21 |
-
|
22 |
|
23 |
# Set up logging
|
24 |
logging.basicConfig(level=logging.INFO)
|
@@ -42,13 +42,13 @@ BASE_URL = "https://chrunos-depot.hf.space"
|
|
42 |
# Deezer ARL token (required for deezspot downloads)
|
43 |
ARL_TOKEN = os.getenv('ARL')
|
44 |
|
|
|
45 |
class DownloadRequest(BaseModel):
|
46 |
url: str
|
47 |
quality: str
|
48 |
arl: str
|
49 |
|
50 |
|
51 |
-
|
52 |
def convert_deezer_short_link_async(short_link: str) -> str:
|
53 |
try:
|
54 |
response = requests.get(short_link, allow_redirects=True)
|
@@ -90,7 +90,7 @@ class RateLimiter:
|
|
90 |
self.max_requests = max_requests
|
91 |
self.time_window = time_window
|
92 |
self.requests: Dict[str, list] = defaultdict(list)
|
93 |
-
|
94 |
def _cleanup_old_requests(self, user_ip: str) -> None:
|
95 |
"""Remove requests that are outside the time window."""
|
96 |
current_time = time.time()
|
@@ -98,21 +98,21 @@ class RateLimiter:
|
|
98 |
timestamp for timestamp in self.requests[user_ip]
|
99 |
if current_time - timestamp < self.time_window.total_seconds()
|
100 |
]
|
101 |
-
|
102 |
def is_rate_limited(self, user_ip: str) -> bool:
|
103 |
"""Check if the user has exceeded their rate limit."""
|
104 |
self._cleanup_old_requests(user_ip)
|
105 |
-
|
106 |
# Get current count after cleanup
|
107 |
current_count = len(self.requests[user_ip])
|
108 |
-
|
109 |
# Add current request timestamp (incrementing the count)
|
110 |
current_time = time.time()
|
111 |
self.requests[user_ip].append(current_time)
|
112 |
-
|
113 |
# Check if user has exceeded the maximum requests
|
114 |
return (current_count + 1) > self.max_requests
|
115 |
-
|
116 |
def get_current_count(self, user_ip: str) -> int:
|
117 |
"""Get the current request count for an IP."""
|
118 |
self._cleanup_old_requests(user_ip)
|
@@ -125,6 +125,7 @@ rate_limiter = RateLimiter(
|
|
125 |
time_window=timedelta(days=1)
|
126 |
)
|
127 |
|
|
|
128 |
def get_user_ip(request: Request) -> str:
|
129 |
"""Helper function to get user's IP address."""
|
130 |
forwarded = request.headers.get("X-Forwarded-For")
|
@@ -135,10 +136,10 @@ def get_user_ip(request: Request) -> str:
|
|
135 |
|
136 |
# Download a track and return a download URL
|
137 |
@app.post("/download/track")
|
138 |
-
def download_track(request: DownloadRequest):
|
139 |
try:
|
140 |
user_ip = get_user_ip(request)
|
141 |
-
|
142 |
if rate_limiter.is_rate_limited(user_ip):
|
143 |
current_count = rate_limiter.get_current_count(user_ip)
|
144 |
raise HTTPException(
|
@@ -148,15 +149,15 @@ def download_track(request: DownloadRequest):
|
|
148 |
"help": "https://t.me/chrunoss"
|
149 |
}
|
150 |
)
|
151 |
-
if
|
152 |
ARL = ARL_TOKEN
|
153 |
else:
|
154 |
-
ARL =
|
155 |
logger.info(f'arl: {ARL}')
|
156 |
-
url =
|
157 |
if 'deezer.page' in url:
|
158 |
url = convert_deezer_short_link_async(url)
|
159 |
-
quality =
|
160 |
dl = DeeLogin(arl=ARL)
|
161 |
|
162 |
if quality not in ["MP3_320", "MP3_128", "FLAC"]:
|
@@ -226,6 +227,7 @@ def download_track(request: DownloadRequest):
|
|
226 |
raise HTTPException(status_code=500, detail=str(e))
|
227 |
|
228 |
|
|
|
229 |
# Pydantic model for album request
|
230 |
class AlbumRequest(BaseModel):
|
231 |
album_id: str
|
|
|
18 |
import time
|
19 |
from datetime import timedelta
|
20 |
import gc
|
21 |
+
from typing import Dict
|
22 |
|
23 |
# Set up logging
|
24 |
logging.basicConfig(level=logging.INFO)
|
|
|
42 |
# Deezer ARL token (required for deezspot downloads)
|
43 |
ARL_TOKEN = os.getenv('ARL')
|
44 |
|
45 |
+
|
46 |
class DownloadRequest(BaseModel):
|
47 |
url: str
|
48 |
quality: str
|
49 |
arl: str
|
50 |
|
51 |
|
|
|
52 |
def convert_deezer_short_link_async(short_link: str) -> str:
|
53 |
try:
|
54 |
response = requests.get(short_link, allow_redirects=True)
|
|
|
90 |
self.max_requests = max_requests
|
91 |
self.time_window = time_window
|
92 |
self.requests: Dict[str, list] = defaultdict(list)
|
93 |
+
|
94 |
def _cleanup_old_requests(self, user_ip: str) -> None:
|
95 |
"""Remove requests that are outside the time window."""
|
96 |
current_time = time.time()
|
|
|
98 |
timestamp for timestamp in self.requests[user_ip]
|
99 |
if current_time - timestamp < self.time_window.total_seconds()
|
100 |
]
|
101 |
+
|
102 |
def is_rate_limited(self, user_ip: str) -> bool:
|
103 |
"""Check if the user has exceeded their rate limit."""
|
104 |
self._cleanup_old_requests(user_ip)
|
105 |
+
|
106 |
# Get current count after cleanup
|
107 |
current_count = len(self.requests[user_ip])
|
108 |
+
|
109 |
# Add current request timestamp (incrementing the count)
|
110 |
current_time = time.time()
|
111 |
self.requests[user_ip].append(current_time)
|
112 |
+
|
113 |
# Check if user has exceeded the maximum requests
|
114 |
return (current_count + 1) > self.max_requests
|
115 |
+
|
116 |
def get_current_count(self, user_ip: str) -> int:
|
117 |
"""Get the current request count for an IP."""
|
118 |
self._cleanup_old_requests(user_ip)
|
|
|
125 |
time_window=timedelta(days=1)
|
126 |
)
|
127 |
|
128 |
+
|
129 |
def get_user_ip(request: Request) -> str:
|
130 |
"""Helper function to get user's IP address."""
|
131 |
forwarded = request.headers.get("X-Forwarded-For")
|
|
|
136 |
|
137 |
# Download a track and return a download URL
|
138 |
@app.post("/download/track")
|
139 |
+
def download_track(request: Request, download_request: DownloadRequest):
|
140 |
try:
|
141 |
user_ip = get_user_ip(request)
|
142 |
+
|
143 |
if rate_limiter.is_rate_limited(user_ip):
|
144 |
current_count = rate_limiter.get_current_count(user_ip)
|
145 |
raise HTTPException(
|
|
|
149 |
"help": "https://t.me/chrunoss"
|
150 |
}
|
151 |
)
|
152 |
+
if download_request.arl is None or download_request.arl.strip() == "":
|
153 |
ARL = ARL_TOKEN
|
154 |
else:
|
155 |
+
ARL = download_request.arl
|
156 |
logger.info(f'arl: {ARL}')
|
157 |
+
url = download_request.url
|
158 |
if 'deezer.page' in url:
|
159 |
url = convert_deezer_short_link_async(url)
|
160 |
+
quality = download_request.quality
|
161 |
dl = DeeLogin(arl=ARL)
|
162 |
|
163 |
if quality not in ["MP3_320", "MP3_128", "FLAC"]:
|
|
|
227 |
raise HTTPException(status_code=500, detail=str(e))
|
228 |
|
229 |
|
230 |
+
|
231 |
# Pydantic model for album request
|
232 |
class AlbumRequest(BaseModel):
|
233 |
album_id: str
|