| | import streamlit as st |
| | import requests |
| | from PIL import Image |
| | from transformers import pipeline |
| | from urllib.parse import urlparse, parse_qs |
| |
|
| | st.set_page_config(page_title="Deepfake Video Detector", layout="centered") |
| |
|
| | st.title("π₯ Deepfake Video Detector") |
| | st.write("Enter a YouTube video URL (supports Shorts & standard videos) to check for deepfakes.") |
| |
|
| | @st.cache_data |
| | def extract_video_id(url): |
| | parsed_url = urlparse(url) |
| | if "youtube" in parsed_url.netloc: |
| | if parsed_url.path.startswith("/watch"): |
| | return parse_qs(parsed_url.query).get("v", [None])[0] |
| | elif parsed_url.path.startswith("/shorts/"): |
| | return parsed_url.path.split("/")[-1] |
| | return None |
| |
|
| | @st.cache_data |
| | def get_thumbnail(video_id): |
| | return f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg" |
| |
|
| | @st.cache_resource |
| | def load_model(): |
| | return pipeline("image-classification", model="facebook/deit-base-distilled-patch16-224") |
| |
|
| | model = load_model() |
| |
|
| | video_url = st.text_input("π Paste YouTube video URL:") |
| | if st.button("Detect Deepfake") and video_url: |
| | video_id = extract_video_id(video_url) |
| | |
| | if video_id: |
| | thumbnail_url = get_thumbnail(video_id) |
| | try: |
| | response = requests.get(thumbnail_url) |
| | response.raise_for_status() |
| | thumbnail = Image.open(requests.get(thumbnail_url, stream=True).raw) |
| | st.image(thumbnail, caption="Video Thumbnail", use_container_width=True) |
| |
|
| | st.write("π Analyzing thumbnail...") |
| | results = model(thumbnail) |
| | |
| | deepfake_score = sum(result['score'] for result in results if 'fake' in result['label'].lower()) |
| | if deepfake_score > 0.5: |
| | st.error(f"β οΈ High probability of deepfake detected! (Confidence: {deepfake_score:.2%})") |
| | else: |
| | st.success(f"β
No strong evidence of deepfake detected. (Confidence: {1 - deepfake_score:.2%})") |
| |
|
| | except requests.exceptions.RequestException: |
| | st.error("β Failed to fetch thumbnail. Please check the video URL.") |
| | else: |
| | st.error("β Invalid YouTube URL. Please enter a valid video or Shorts link.") |
| |
|