tecuts commited on
Commit
2cb5c72
·
verified ·
1 Parent(s): 4a7e269

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -1
app.py CHANGED
@@ -8,6 +8,7 @@ import os
8
  import logging
9
  import requests
10
  from datetime import datetime, timedelta
 
11
  import time
12
  import asyncio
13
  import cloudscraper
@@ -280,8 +281,88 @@ async def get_track_download_url(track_id: str, quality: str) -> str:
280
  logger.error(f"No download URL found")
281
  return ""
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  @app.post("/track_dl")
284
- async def track_dl(request: TrackDownloadRequest):
 
 
 
 
 
 
 
 
 
 
 
285
  try:
286
  quality_num = int(request.quality)
287
  if quality_num > 128 or request.quality.upper() == 'FLAC':
 
8
  import logging
9
  import requests
10
  from datetime import datetime, timedelta
11
+ from collections import defaultdict
12
  import time
13
  import asyncio
14
  import cloudscraper
 
281
  logger.error(f"No download URL found")
282
  return ""
283
 
284
+
285
+ # Rate limiting dictionary
286
+ class RateLimiter:
287
+ def __init__(self, max_requests: int, time_window: timedelta):
288
+ self.max_requests = max_requests
289
+ self.time_window = time_window
290
+ self.requests: Dict[str, list] = defaultdict(list)
291
+
292
+ def _cleanup_old_requests(self, user_ip: str) -> None:
293
+ """Remove requests that are outside the time window."""
294
+ current_time = time.time()
295
+ self.requests[user_ip] = [
296
+ timestamp for timestamp in self.requests[user_ip]
297
+ if current_time - timestamp < self.time_window.total_seconds()
298
+ ]
299
+
300
+ def is_rate_limited(self, user_ip: str) -> bool:
301
+ """Check if the user has exceeded their rate limit."""
302
+ self._cleanup_old_requests(user_ip)
303
+
304
+ # Get current count after cleanup
305
+ current_count = len(self.requests[user_ip])
306
+
307
+ # Add current request timestamp (incrementing the count)
308
+ current_time = time.time()
309
+ self.requests[user_ip].append(current_time)
310
+
311
+ # Check if user has exceeded the maximum requests
312
+ return (current_count + 1) > self.max_requests
313
+
314
+ def get_current_count(self, user_ip: str) -> int:
315
+ """Get the current request count for an IP."""
316
+ self._cleanup_old_requests(user_ip)
317
+ return len(self.requests[user_ip])
318
+
319
+
320
+ # Initialize rate limiter with 100 requests per day
321
+ rate_limiter = RateLimiter(
322
+ max_requests=3,
323
+ time_window=timedelta(days=1)
324
+ )
325
+
326
+ def get_user_ip(request: Request) -> str:
327
+ """Helper function to get user's IP address."""
328
+ forwarded = request.headers.get("X-Forwarded-For")
329
+ if forwarded:
330
+ return forwarded.split(",")[0]
331
+ return request.client.host
332
+
333
+
334
+ class ApiRotator:
335
+ def __init__(self, apis):
336
+ self.apis = apis
337
+ self.last_successful_index = None
338
+
339
+ def get_prioritized_apis(self):
340
+ if self.last_successful_index is not None:
341
+ # Move the last successful API to the front
342
+ rotated_apis = (
343
+ [self.apis[self.last_successful_index]] +
344
+ self.apis[:self.last_successful_index] +
345
+ self.apis[self.last_successful_index+1:]
346
+ )
347
+ return rotated_apis
348
+ return self.apis
349
+
350
+ def update_last_successful(self, index):
351
+ self.last_successful_index = index
352
+
353
  @app.post("/track_dl")
354
+ async def track_dl(request: TrackDownloadRequest, req: Request):
355
+ user_ip = get_user_ip(req)
356
+
357
+ if rate_limiter.is_rate_limited(user_ip):
358
+ current_count = rate_limiter.get_current_count(user_ip)
359
+ raise HTTPException(
360
+ status_code=429,
361
+ detail={
362
+ "error": "You have exceeded the maximum number of requests per day. Please try again tomorrow.",
363
+ "url": "https://t.me/chrunoss"
364
+ }
365
+ )
366
  try:
367
  quality_num = int(request.quality)
368
  if quality_num > 128 or request.quality.upper() == 'FLAC':