MyanmarSwe commited on
Commit
440ede7
·
verified ·
1 Parent(s): a1e39f2

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +30 -28
main.py CHANGED
@@ -6,6 +6,7 @@ import httpx
6
  import random
7
  import asyncio
8
  import urllib.parse
 
9
  from bs4 import BeautifulSoup
10
  from fastapi import FastAPI, HTTPException, Request
11
  from fastapi.responses import StreamingResponse
@@ -66,6 +67,8 @@ async def download_proxy(request: Request, url: str, key: str = None):
66
  clean_url = urllib.parse.unquote(clean_url)
67
  if prev_url == clean_url: break
68
 
 
 
69
  range_header = request.headers.get('range')
70
 
71
  # --- MediaFire ---
@@ -74,9 +77,7 @@ async def download_proxy(request: Request, url: str, key: str = None):
74
  browser_headers = {
75
  'User-Agent': ua.random,
76
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
77
- 'Accept-Language': 'en-US,en;q=0.5',
78
  'Referer': 'https://www.mediafire.com/',
79
- 'Connection': 'keep-alive',
80
  }
81
 
82
  r = await client.get(clean_url, headers=browser_headers)
@@ -84,32 +85,27 @@ async def download_proxy(request: Request, url: str, key: str = None):
84
  raise HTTPException(status_code=r.status_code, detail="MediaFire page access denied")
85
 
86
  target_link = None
87
- # Method 1: Regex
88
  match = re.search(r"https?://download[0-9]+\.mediafire\.com/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/[^\s'\"]+", r.text)
89
  if match:
90
  target_link = match.group(0).replace('"', '').replace("'", "")
91
 
92
- # Method 2: BS4
93
  if not target_link:
94
  soup = BeautifulSoup(r.text, 'html.parser')
95
  btn = soup.find('a', {'id': 'downloadButton'})
96
  if btn and btn.get('href'):
97
  target_link = btn.get('href')
98
 
99
- # --- အရေးကြီးသောပြင်ဆင်ချက်: Relative URL ကို Absolute URL သို့ပြောင်းခြင်း ---
100
  if target_link:
101
- if target_link.startswith("//"):
102
- target_link = f"https:{target_link}"
103
- elif target_link.startswith("/"):
104
- target_link = f"https://www.mediafire.com{target_link}"
105
 
106
  if not target_link:
107
- raise HTTPException(status_code=404, detail="Direct link extraction failed")
108
 
109
- return await stream_file(target_link, range_header, referer=clean_url)
110
 
111
  except Exception as e:
112
- print(f"MediaFire Error: {str(e)}")
113
  raise HTTPException(status_code=500, detail=str(e))
114
 
115
  # --- Google Drive ---
@@ -131,17 +127,17 @@ async def download_proxy(request: Request, url: str, key: str = None):
131
  req = client.build_request("GET", api_link, headers=headers)
132
  r = await client.send(req, stream=True)
133
  if r.status_code in [200, 206]:
134
- return await process_response(r)
135
  await r.aclose()
136
  except: continue
137
 
138
  public_url = f"https://drive.google.com/uc?export=download&id={file_id}"
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, referer=None):
145
  headers = {'User-Agent': ua.random}
146
  if range_header: headers['Range'] = range_header
147
  if referer: headers['Referer'] = referer
@@ -151,24 +147,30 @@ async def stream_file(target_url, range_header, referer=None):
151
  r = await client.send(req, stream=True)
152
  if r.status_code >= 400:
153
  await r.aclose()
154
- raise HTTPException(status_code=r.status_code, detail=f"Remote server returned {r.status_code}")
155
- return await process_response(r)
156
  except Exception as e:
157
- print(f"Stream Error: {e}")
158
  raise HTTPException(status_code=500, detail=str(e))
159
 
160
- async def process_response(r):
161
- # Player များအတွက်ိမဖလိုအပ်သော Header မျာ
 
 
 
 
 
 
162
  safe_headers = [
163
- 'content-type', 'content-length', 'content-range',
164
- 'accept-ranges', 'content-disposition', 'cache-control'
165
  ]
166
  response_headers = {n: v for n, v in r.headers.items() if n.lower() in safe_headers}
167
 
168
- if 'accept-ranges' not in [k.lower() for k in response_headers.keys()]:
169
- response_headers['Accept-Ranges'] = 'bytes'
170
-
171
- media_type = r.headers.get('content-type', 'application/octet-stream')
 
 
172
 
173
  async def stream_generator():
174
  try:
@@ -181,7 +183,7 @@ async def process_response(r):
181
  stream_generator(),
182
  status_code=r.status_code,
183
  headers=response_headers,
184
- media_type=media_type
185
  )
186
 
187
  if __name__ == "__main__":
 
6
  import random
7
  import asyncio
8
  import urllib.parse
9
+ import mimetypes
10
  from bs4 import BeautifulSoup
11
  from fastapi import FastAPI, HTTPException, Request
12
  from fastapi.responses import StreamingResponse
 
67
  clean_url = urllib.parse.unquote(clean_url)
68
  if prev_url == clean_url: break
69
 
70
+ # ဖိုင်နာမည်ကို URL ထဲမှ ကြိုတင်ထုတ်ယူထားခြင်း (Media Type သိရှိနိုင်ရန်)
71
+ filename = clean_url.split('/')[-1] if '/' in clean_url else "video.mp4"
72
  range_header = request.headers.get('range')
73
 
74
  # --- MediaFire ---
 
77
  browser_headers = {
78
  'User-Agent': ua.random,
79
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
 
80
  'Referer': 'https://www.mediafire.com/',
 
81
  }
82
 
83
  r = await client.get(clean_url, headers=browser_headers)
 
85
  raise HTTPException(status_code=r.status_code, detail="MediaFire page access denied")
86
 
87
  target_link = None
88
+ # Direct link ရှာခြင်း
89
  match = re.search(r"https?://download[0-9]+\.mediafire\.com/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/[^\s'\"]+", r.text)
90
  if match:
91
  target_link = match.group(0).replace('"', '').replace("'", "")
92
 
 
93
  if not target_link:
94
  soup = BeautifulSoup(r.text, 'html.parser')
95
  btn = soup.find('a', {'id': 'downloadButton'})
96
  if btn and btn.get('href'):
97
  target_link = btn.get('href')
98
 
 
99
  if target_link:
100
+ if target_link.startswith("//"): target_link = f"https:{target_link}"
101
+ elif target_link.startswith("/"): target_link = f"https://www.mediafire.com{target_link}"
 
 
102
 
103
  if not target_link:
104
+ raise HTTPException(status_code=404, detail="Direct link not found")
105
 
106
+ return await stream_file(target_link, range_header, filename, referer=clean_url)
107
 
108
  except Exception as e:
 
109
  raise HTTPException(status_code=500, detail=str(e))
110
 
111
  # --- Google Drive ---
 
127
  req = client.build_request("GET", api_link, headers=headers)
128
  r = await client.send(req, stream=True)
129
  if r.status_code in [200, 206]:
130
+ return await process_response(r, filename)
131
  await r.aclose()
132
  except: continue
133
 
134
  public_url = f"https://drive.google.com/uc?export=download&id={file_id}"
135
+ return await stream_file(public_url, range_header, filename)
136
 
137
  else:
138
+ return await stream_file(clean_url, range_header, filename)
139
 
140
+ async def stream_file(target_url, range_header, filename, referer=None):
141
  headers = {'User-Agent': ua.random}
142
  if range_header: headers['Range'] = range_header
143
  if referer: headers['Referer'] = referer
 
147
  r = await client.send(req, stream=True)
148
  if r.status_code >= 400:
149
  await r.aclose()
150
+ raise HTTPException(status_code=r.status_code, detail="Remote server rejected")
151
+ return await process_response(r, filename)
152
  except Exception as e:
 
153
  raise HTTPException(status_code=500, detail=str(e))
154
 
155
+ async def process_response(r, filename):
156
+ # MIME type ခန့်မှန်းခ်း
157
+ mime_type, _ = mimetypes.guess_type(filename)
158
+ if not mime_type or mime_type == 'application/octet-stream':
159
+ if filename.endswith('.mkv'): mime_type = 'video/x-matroska'
160
+ elif filename.endswith('.mp4'): mime_type = 'video/mp4'
161
+ else: mime_type = r.headers.get('content-type', 'video/mp4')
162
+
163
  safe_headers = [
164
+ 'content-length', 'content-range', 'accept-ranges', 'cache-control'
 
165
  ]
166
  response_headers = {n: v for n, v in r.headers.items() if n.lower() in safe_headers}
167
 
168
+ # nPlayer အတွက် မရှိမဖြစ်လိုအပ်ချက်များ
169
+ response_headers['Accept-Ranges'] = 'bytes'
170
+ response_headers['Content-Type'] = mime_type
171
+ # filename အတိအကျကို header ထဲထည့်ပေးခြင်း
172
+ encoded_filename = urllib.parse.quote(filename)
173
+ response_headers['Content-Disposition'] = f'inline; filename="{encoded_filename}"; filename*=UTF-8\'\'{encoded_filename}'
174
 
175
  async def stream_generator():
176
  try:
 
183
  stream_generator(),
184
  status_code=r.status_code,
185
  headers=response_headers,
186
+ media_type=mime_type
187
  )
188
 
189
  if __name__ == "__main__":