Translsis commited on
Commit
b0881e7
·
verified ·
1 Parent(s): 641599c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +98 -114
app.py CHANGED
@@ -181,24 +181,77 @@ def get_stream_url(driver):
181
  try:
182
  log("🔍 Đang tìm stream URL...")
183
 
184
- # Đợi thêm để video load
185
- time.sleep(8)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
- # Phương pháp 1: Tìm trong network requests (ưu tiên)
188
- log("🔍 Phân tích network requests...")
189
 
190
  try:
191
  logs = driver.get_log('performance')
192
- stream_candidates = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  'hls': [],
194
  'dash': [],
195
- 'mp4': [],
196
- 'other': []
197
  }
198
 
199
- # Danh sách extension không phải video
200
- invalid_extensions = ['.js', '.css', '.json', '.html', '.woff', '.ttf', '.svg', '.png', '.jpg', '.gif', '.ico', '.xml']
201
-
202
  for entry in logs:
203
  import json
204
  try:
@@ -207,129 +260,60 @@ def get_stream_url(driver):
207
  if log_entry['method'] == 'Network.requestWillBeSent':
208
  url = log_entry['params']['request']['url']
209
 
210
- # Bỏ qua các file không phải video
211
- if any(url.endswith(ext) for ext in invalid_extensions):
212
  continue
213
-
214
- # Bỏ qua các domain không liên quan
215
- if any(x in url.lower() for x in ['google', 'analytics', 'facebook', 'twitter', 'ads', 'tracking']):
216
  continue
217
 
218
- # Phân loại stream
219
  if '.m3u8' in url:
220
- stream_candidates['hls'].append(url)
221
- log(f"🎯 HLS: {url[:80]}...")
222
  elif '.mpd' in url:
223
- stream_candidates['dash'].append(url)
224
- log(f"🎯 DASH: {url[:80]}...")
225
- elif '.mp4' in url or '.flv' in url or '.webm' in url:
226
- stream_candidates['mp4'].append(url)
227
- log(f"🎯 MP4: {url[:80]}...")
228
- elif any(keyword in url.lower() for keyword in ['stream', 'video', 'live', 'hls', 'manifest', 'playlist']):
229
- # Chỉ thêm nếu không phải file tĩnh
230
- if not any(url.endswith(ext) for ext in invalid_extensions):
231
- stream_candidates['other'].append(url)
232
- log(f"🎯 Stream: {url[:80]}...")
233
  except:
234
  continue
235
 
236
- # Chọn stream tốt nhất theo thứ tự ưu tiên
237
- if stream_candidates['hls']:
238
- url = stream_candidates['hls'][0]
 
239
  log(f"✅ Chọn HLS stream")
240
  log(f"📺 {url}")
241
  return url
242
 
243
- if stream_candidates['dash']:
244
- url = stream_candidates['dash'][0]
 
245
  log(f"✅ Chọn DASH stream")
246
  log(f"📺 {url}")
247
  return url
248
 
249
- if stream_candidates['mp4']:
250
- url = stream_candidates['mp4'][0]
251
- log(f"✅ Chọn MP4 stream")
252
- log(f"📺 {url}")
253
- return url
254
-
255
- if stream_candidates['other']:
256
- url = stream_candidates['other'][0]
257
- log(f" Chọn stream")
258
- log(f"📺 {url}")
259
- return url
260
 
261
  except Exception as e:
262
- log(f"⚠️ Lỗi network analysis: {e}")
263
 
264
- # Phương pháp 2: Lấy từ video element
265
- log("🔍 Kiểm tra video element...")
266
- try:
267
- wait = WebDriverWait(driver, 10)
268
- video_element = wait.until(
269
- EC.presence_of_element_located((By.TAG_NAME, "video"))
270
- )
271
-
272
- # Thử nhiều cách lấy URL
273
- for method in ['src', 'currentSrc']:
274
- try:
275
- stream_url = driver.execute_script(f"return arguments[0].{method}", video_element)
276
- if stream_url and stream_url.startswith('http') and not any(stream_url.endswith(ext) for ext in ['.js', '.css']):
277
- log(f"✅ Stream từ video.{method}")
278
- log(f"📺 {stream_url}")
279
- return stream_url
280
- except:
281
- pass
282
-
283
- # Lấy từ source elements
284
- try:
285
- sources = driver.execute_script("""
286
- var video = arguments[0];
287
- var sources = video.querySelectorAll('source');
288
- return Array.from(sources).map(s => s.src);
289
- """, video_element)
290
-
291
- for src in sources:
292
- if src and src.startswith('http') and not any(src.endswith(ext) for ext in ['.js', '.css']):
293
- log(f"✅ Stream từ source element")
294
- log(f"📺 {src}")
295
- return src
296
- except:
297
- pass
298
-
299
- except Exception as e:
300
- log(f"⚠️ Video element: {e}")
301
-
302
- # Phương pháp 3: Tìm trong iframe
303
- log("🔍 Kiểm tra iframe...")
304
- try:
305
- iframes = driver.find_elements(By.TAG_NAME, "iframe")
306
- log(f"Tìm thấy {len(iframes)} iframe(s)")
307
-
308
- for i, iframe in enumerate(iframes):
309
- try:
310
- driver.switch_to.frame(iframe)
311
-
312
- # Tìm video trong iframe
313
- videos = driver.find_elements(By.TAG_NAME, "video")
314
- if videos:
315
- for vid in videos:
316
- src = driver.execute_script("return arguments[0].src || arguments[0].currentSrc", vid)
317
- if src and src.startswith('http'):
318
- driver.switch_to.default_content()
319
- log(f"✅ Stream từ iframe {i}")
320
- log(f"📺 {src}")
321
- return src
322
-
323
- driver.switch_to.default_content()
324
- except:
325
- driver.switch_to.default_content()
326
- continue
327
- except Exception as e:
328
- log(f"⚠️ Iframe check: {e}")
329
-
330
- log("❌ Không tìm thấy stream URL hợp lệ")
331
- log("💡 Gợi ý: Thử URL khác hoặc kiểm tra trang có phát video không")
332
- return None
333
 
334
  except Exception as e:
335
  log(f"❌ Lỗi: {e}")
 
181
  try:
182
  log("🔍 Đang tìm stream URL...")
183
 
184
+ # Đợi video load
185
+ time.sleep(10)
186
+
187
+ # Phương pháp 1: Lấy trực tiếp từ video element
188
+ log("🔍 Kiểm tra video element...")
189
+ try:
190
+ wait = WebDriverWait(driver, 15)
191
+ video_element = wait.until(
192
+ EC.presence_of_element_located((By.TAG_NAME, "video"))
193
+ )
194
+
195
+ # Lấy tất cả thuộc tính của video
196
+ video_info = driver.execute_script("""
197
+ var video = arguments[0];
198
+ return {
199
+ src: video.src || '',
200
+ currentSrc: video.currentSrc || '',
201
+ networkState: video.networkState,
202
+ readyState: video.readyState,
203
+ duration: video.duration,
204
+ paused: video.paused
205
+ };
206
+ """, video_element)
207
+
208
+ log(f"📊 Video info: readyState={video_info['readyState']}, paused={video_info['paused']}")
209
+
210
+ # Kiểm tra src
211
+ for src_key in ['currentSrc', 'src']:
212
+ url = video_info.get(src_key, '')
213
+ if url and not url.startswith('blob:') and url.startswith('http'):
214
+ log(f"✅ Stream từ video.{src_key}")
215
+ log(f"📺 {url}")
216
+ return url
217
+
218
+ # Nếu là blob URL, cần tìm URL gốc
219
+ if video_info.get('currentSrc', '').startswith('blob:'):
220
+ log("⚠️ Video dùng blob URL - cần tìm stream gốc")
221
+
222
+ except Exception as e:
223
+ log(f"⚠️ Video element: {str(e)[:100]}")
224
 
225
+ # Phương pháp 2: Tìm HLS/DASH manifest trong network
226
+ log("🔍 Tìm manifest trong network...")
227
 
228
  try:
229
  logs = driver.get_log('performance')
230
+
231
+ # Danh sách pattern tìm kiếm
232
+ video_patterns = [
233
+ '.m3u8', # HLS
234
+ '.mpd', # DASH
235
+ '/hls/',
236
+ '/dash/',
237
+ 'manifest',
238
+ 'playlist',
239
+ 'master.m3u8',
240
+ 'index.m3u8',
241
+ '/live/',
242
+ '/stream/'
243
+ ]
244
+
245
+ # Extensions không hợp lệ
246
+ invalid_exts = ['.js', '.css', '.json', '.html', '.woff', '.ttf', '.svg',
247
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.xml', '.txt', '.webp']
248
+
249
+ stream_urls = {
250
  'hls': [],
251
  'dash': [],
252
+ 'live': []
 
253
  }
254
 
 
 
 
255
  for entry in logs:
256
  import json
257
  try:
 
260
  if log_entry['method'] == 'Network.requestWillBeSent':
261
  url = log_entry['params']['request']['url']
262
 
263
+ # Skip invalid
264
+ if not url.startswith('http'):
265
  continue
266
+ if any(url.endswith(ext) for ext in invalid_exts):
267
+ continue
268
+ if 'google' in url or 'facebook' in url or 'analytics' in url:
269
  continue
270
 
271
+ # Tìm HLS
272
  if '.m3u8' in url:
273
+ stream_urls['hls'].append(url)
274
+ # Tìm DASH
275
  elif '.mpd' in url:
276
+ stream_urls['dash'].append(url)
277
+ # Tìm live stream URLs
278
+ elif any(pattern in url.lower() for pattern in ['/hls/', '/dash/', '/live/', '/stream/', 'manifest', 'playlist']):
279
+ if not any(url.endswith(ext) for ext in invalid_exts):
280
+ stream_urls['live'].append(url)
 
 
 
 
 
281
  except:
282
  continue
283
 
284
+ # Log kết quả
285
+ if stream_urls['hls']:
286
+ log(f"🎯 Tìm thấy {len(stream_urls['hls'])} HLS stream(s)")
287
+ url = stream_urls['hls'][0]
288
  log(f"✅ Chọn HLS stream")
289
  log(f"📺 {url}")
290
  return url
291
 
292
+ if stream_urls['dash']:
293
+ log(f"🎯 Tìm thấy {len(stream_urls['dash'])} DASH stream(s)")
294
+ url = stream_urls['dash'][0]
295
  log(f"✅ Chọn DASH stream")
296
  log(f"📺 {url}")
297
  return url
298
 
299
+ if stream_urls['live']:
300
+ log(f"🎯 Tìm thấy {len(stream_urls['live'])} live stream(s)")
301
+ for url in stream_urls['live']:
302
+ log(f" - {url[:100]}...")
303
+ # Chọn URL có vẻ đúng nhất
304
+ for url in stream_urls['live']:
305
+ if any(x in url.lower() for x in ['m3u8', 'mpd', 'manifest', 'playlist', 'master']):
306
+ log(f"✅ Chọn live stream")
307
+ log(f"📺 {url}")
308
+ return url
 
309
 
310
  except Exception as e:
311
+ log(f"⚠️ Network analysis: {str(e)[:100]}")
312
 
313
+ # Phương pháp 3: Screenshot + screen recording
314
+ log("💡 Không tìm thấy stream URL trực tiếp")
315
+ log("🎥 Sẽ thử ghi màn hình video player...")
316
+ return "SCREEN_RECORD"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
 
318
  except Exception as e:
319
  log(f"❌ Lỗi: {e}")