MyanmarSwe commited on
Commit
384bcc1
·
verified ·
1 Parent(s): 2a4580d

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +36 -24
main.py CHANGED
@@ -60,46 +60,59 @@ async def download_proxy(request: Request, url: str, key: str = None):
60
  if key != ACCESS_KEY:
61
  raise HTTPException(status_code=403, detail="Access Denied")
62
 
63
- url = urllib.parse.unquote(url)
 
 
 
 
 
 
64
  range_header = request.headers.get('range')
65
 
66
  # --- MediaFire ---
67
- if "mediafire.com" in url:
68
- target_link = None
69
- headers = {'User-Agent': ua.random}
70
  try:
71
- r = await client.get(url, headers=headers)
72
- # ပိုမိုတိကျသော Regex ဖြင့် Direct Link ရှာခြင်း
73
- match = re.search(r'https?://download[0-9]+\.mediafire\.com/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/[^"]+', r.text)
 
 
 
 
 
 
74
  if match:
75
- target_link = match.group(0)
76
- else:
 
 
77
  soup = BeautifulSoup(r.text, 'html.parser')
78
  btn = soup.find('a', {'id': 'downloadButton'})
79
  if btn and btn.get('href'):
80
  target_link = btn.get('href')
81
-
82
  if not target_link:
83
- raise HTTPException(status_code=404, detail="MediaFire direct link not found")
84
 
85
  return await stream_file(target_link, range_header)
86
  except Exception as e:
87
- raise HTTPException(status_code=500, detail=f"MediaFire Error: {str(e)}")
 
88
 
89
  # --- Dropbox ---
90
- elif "dropbox.com" in url:
91
- target_link = url.replace("?dl=0", "").split("?")[0] + "?dl=1"
92
  return await stream_file(target_link, range_header)
93
 
94
  # --- OneDrive ---
95
- elif "1drv.ms" in url or "onedrive.live.com" in url:
96
- encoded_url = base64.b64encode(bytes(url, 'utf-8')).decode('utf-8').replace('=', '').replace('/', '_').replace('+', '-')
97
  target_link = f"https://api.onedrive.com/v1.0/shares/u!{encoded_url}/root/content"
98
  return await stream_file(target_link, range_header)
99
 
100
  # --- Google Drive ---
101
- elif "drive.google.com" in url:
102
- file_id = get_google_file_id(url)
103
  if not file_id:
104
  raise HTTPException(status_code=400, detail="Invalid Google Drive Link")
105
 
@@ -126,14 +139,14 @@ async def download_proxy(request: Request, url: str, key: str = None):
126
  return await stream_file(public_url, range_header)
127
 
128
  else:
129
- # Generic fallback for other direct links
130
- return await stream_file(url, range_header)
131
 
132
  async def stream_file(target_url, range_header):
133
  headers = {'User-Agent': ua.random}
134
  if range_header: headers['Range'] = range_header
135
 
136
  try:
 
137
  req = client.build_request("GET", target_url, headers=headers)
138
  r = await client.send(req, stream=True)
139
  return await process_response(r)
@@ -141,7 +154,7 @@ async def stream_file(target_url, range_header):
141
  raise HTTPException(status_code=500, detail=str(e))
142
 
143
  async def process_response(r):
144
- # Pass-through critical headers for streaming
145
  safe_headers = [
146
  'content-type', 'content-length', 'content-range',
147
  'accept-ranges', 'content-disposition', 'cache-control'
@@ -149,16 +162,15 @@ async def process_response(r):
149
 
150
  response_headers = {n: v for n, v in r.headers.items() if n.lower() in safe_headers}
151
 
152
- # Force basic streaming headers if missing
153
  if 'accept-ranges' not in [k.lower() for k in response_headers.keys()]:
154
  response_headers['Accept-Ranges'] = 'bytes'
155
 
156
- # nPlayer/VLC အတွက် Content-Type သည် အရေးကြီးပါသည်
157
  media_type = r.headers.get('content-type', 'application/octet-stream')
158
 
159
  async def stream_generator():
160
  try:
161
- async for chunk in r.aiter_bytes(chunk_size=262144): # Chunk size ကို 256KB သို့ တိုးမြှင့်ထားသည်
162
  yield chunk
163
  finally:
164
  await r.aclose()
 
60
  if key != ACCESS_KEY:
61
  raise HTTPException(status_code=403, detail="Access Denied")
62
 
63
+ # URL ကို အကြိမ်ကြိမ် Decode လုပ်ပြီး သန့်စင်ခြင်း
64
+ clean_url = urllib.parse.unquote(url)
65
+ while "%" in clean_url:
66
+ prev_url = clean_url
67
+ clean_url = urllib.parse.unquote(clean_url)
68
+ if prev_url == clean_url: break
69
+
70
  range_header = request.headers.get('range')
71
 
72
  # --- MediaFire ---
73
+ if "mediafire.com" in clean_url:
 
 
74
  try:
75
+ # MediaFire Page ကို ခေါ်ယူခြင်း
76
+ r = await client.get(clean_url, headers={'User-Agent': ua.random})
77
+ if r.status_code != 200:
78
+ raise HTTPException(status_code=r.status_code, detail="Failed to access MediaFire page")
79
+
80
+ # Direct Link ရှာဖွေခြင်း
81
+ target_link = None
82
+ # Method 1: Regex
83
+ match = re.search(r"https?://download[0-9]+\.mediafire\.com/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/[^\s'\"]+", r.text)
84
  if match:
85
+ target_link = match.group(0).replace('"', '').replace("'", "")
86
+
87
+ # Method 2: BeautifulSoup (Regex မတွေ့ရင်)
88
+ if not target_link:
89
  soup = BeautifulSoup(r.text, 'html.parser')
90
  btn = soup.find('a', {'id': 'downloadButton'})
91
  if btn and btn.get('href'):
92
  target_link = btn.get('href')
93
+
94
  if not target_link:
95
+ raise HTTPException(status_code=404, detail="Direct link not found in MediaFire page")
96
 
97
  return await stream_file(target_link, range_header)
98
  except Exception as e:
99
+ print(f"MediaFire Error: {str(e)}")
100
+ raise HTTPException(status_code=500, detail=str(e))
101
 
102
  # --- Dropbox ---
103
+ elif "dropbox.com" in clean_url:
104
+ target_link = clean_url.replace("?dl=0", "").split("?")[0] + "?dl=1"
105
  return await stream_file(target_link, range_header)
106
 
107
  # --- OneDrive ---
108
+ elif "1drv.ms" in clean_url or "onedrive.live.com" in clean_url:
109
+ encoded_url = base64.b64encode(bytes(clean_url, 'utf-8')).decode('utf-8').replace('=', '').replace('/', '_').replace('+', '-')
110
  target_link = f"https://api.onedrive.com/v1.0/shares/u!{encoded_url}/root/content"
111
  return await stream_file(target_link, range_header)
112
 
113
  # --- Google Drive ---
114
+ elif "drive.google.com" in clean_url:
115
+ file_id = get_google_file_id(clean_url)
116
  if not file_id:
117
  raise HTTPException(status_code=400, detail="Invalid Google Drive Link")
118
 
 
139
  return await stream_file(public_url, range_header)
140
 
141
  else:
142
+ return await stream_file(clean_url, range_header)
 
143
 
144
  async def stream_file(target_url, range_header):
145
  headers = {'User-Agent': ua.random}
146
  if range_header: headers['Range'] = range_header
147
 
148
  try:
149
+ # Redirect တွေကို ကိုင်တွယ်နိုင်ရန် client object ကို သုံးသည်
150
  req = client.build_request("GET", target_url, headers=headers)
151
  r = await client.send(req, stream=True)
152
  return await process_response(r)
 
154
  raise HTTPException(status_code=500, detail=str(e))
155
 
156
  async def process_response(r):
157
+ # Streaming အတွက် လိုအပ်သော Header များကို သန့်စင်ယူခြင်း
158
  safe_headers = [
159
  'content-type', 'content-length', 'content-range',
160
  'accept-ranges', 'content-disposition', 'cache-control'
 
162
 
163
  response_headers = {n: v for n, v in r.headers.items() if n.lower() in safe_headers}
164
 
165
+ # Header ထဲမှာ မပါလာရင်တောင် Bytes range လက်ခံကြောင်း ပြောထားမှ Player တွေ အဆင်ပြေမည်
166
  if 'accept-ranges' not in [k.lower() for k in response_headers.keys()]:
167
  response_headers['Accept-Ranges'] = 'bytes'
168
 
 
169
  media_type = r.headers.get('content-type', 'application/octet-stream')
170
 
171
  async def stream_generator():
172
  try:
173
+ async for chunk in r.aiter_bytes(chunk_size=262144):
174
  yield chunk
175
  finally:
176
  await r.aclose()