Spaces:
Running
Running
import streamlit as st | |
import requests | |
from transformers import pipeline | |
from deepface import DeepFace | |
from PIL import Image | |
import io | |
import re | |
import base64 | |
# Load Fake News Detection Model from Hugging Face | |
fake_news_pipeline = pipeline("text-classification", model="mrm8488/bert-tiny-finetuned-fake-news-detection") | |
def classify_text(news_text): | |
"""Classifies text as Fake or Real with accuracy.""" | |
result = fake_news_pipeline(news_text)[0] | |
label = result['label'].lower() | |
score = result['score'] * 100 # Convert to percentage | |
return ("Fake" if label == "fake" else "Real"), round(score, 2) | |
def analyze_image(image): | |
"""Analyzes image using DeepFace and Google Reverse Image Search.""" | |
try: | |
analysis = DeepFace.analyze(image, actions=['emotion']) | |
dominant_emotion = analysis[0]['dominant_emotion'] | |
reverse_search_url = reverse_image_search(image) | |
return f"Analysis: {dominant_emotion}", 90.0, reverse_search_url # Dummy Accuracy | |
except Exception as e: | |
return f"Error: {str(e)}", 0.0, None | |
def reverse_image_search(image): | |
"""Creates a Google Reverse Image Search link for verification.""" | |
buffered = io.BytesIO() | |
image.save(buffered, format="PNG") | |
encoded_img = base64.b64encode(buffered.getvalue()).decode() | |
return f"https://www.google.com/searchbyimage?image_url=data:image/png;base64,{encoded_img}" | |
def verify_news(news_text): | |
"""Searches trusted fact-checking websites for news verification.""" | |
sources = [ | |
("BBC News", "https://www.bbc.com/news"), | |
("CNN", "https://www.cnn.com"), | |
("Reuters", "https://www.reuters.com"), | |
("FactCheck.org", "https://www.factcheck.org"), | |
("Snopes", "https://www.snopes.com"), | |
("PolitiFact", "https://www.politifact.com"), | |
("Google Search", f"https://www.google.com/search?q={'+'.join(news_text.split())}") | |
] | |
return sources | |
def extract_video_id(video_url): | |
"""Extracts the video ID from a YouTube URL.""" | |
pattern = r"(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})" | |
match = re.search(pattern, video_url) | |
return match.group(1) if match else None | |
def fetch_video_metadata(video_url): | |
"""Fetches video metadata and runs Fake News detection on it.""" | |
video_id = extract_video_id(video_url) | |
if not video_id: | |
return "Invalid Video URL", 0.0, None | |
api_key = "YOUR_YOUTUBE_API_KEY" # Replace with a valid YouTube API Key | |
metadata_url = f"https://www.googleapis.com/youtube/v3/videos?id={video_id}&part=snippet&key={api_key}" | |
response = requests.get(metadata_url) | |
if response.status_code == 200: | |
data = response.json() | |
if "items" in data and len(data["items"]) > 0: | |
video_details = data["items"][0]["snippet"] | |
video_title = video_details["title"] | |
video_description = video_details["description"] | |
combined_text = video_title + " " + video_description | |
# Classify the video metadata text | |
result, accuracy = classify_text(combined_text) | |
verification_links = verify_news(video_title) | |
return result, accuracy, verification_links | |
return "Unknown", 0.0, None | |
# Streamlit UI | |
st.set_page_config(page_title="Fake News Detector", layout="wide") | |
st.title("π° Fake News Detector") | |
# πΉ Three Separate Sections for Input | |
st.subheader("π Choose an Input Type") | |
col1, col2, col3 = st.columns(3) | |
# πΉ Text Input Section | |
with col1: | |
st.markdown("### π Text Input") | |
news_text = st.text_area("Enter the news content to check:", height=150) | |
analyze_text_clicked = st.button("Analyze News") | |
if analyze_text_clicked: | |
if not news_text.strip(): | |
st.warning("Please enter some text.") | |
else: | |
result, accuracy = classify_text(news_text) | |
verification_links = verify_news(news_text) | |
st.session_state["text_result"] = result | |
st.session_state["text_accuracy"] = accuracy | |
st.session_state["text_verification"] = verification_links | |
# πΉ Image Upload Section | |
with col2: | |
st.markdown("### πΌοΈ Image Upload") | |
uploaded_image = st.file_uploader("Upload a news image", type=["jpg", "png", "jpeg"]) | |
analyze_image_clicked = st.button("Analyze Image") | |
if uploaded_image and analyze_image_clicked: | |
image = Image.open(uploaded_image) | |
result, accuracy, reverse_search_url = analyze_image(image) | |
st.session_state["image_result"] = result | |
st.session_state["image_accuracy"] = accuracy | |
st.session_state["image_search_url"] = reverse_search_url | |
st.session_state["news_image"] = image # Store Image for Display | |
# πΉ Video Link Section | |
with col3: | |
st.markdown("### π₯ Video Link") | |
video_url = st.text_input("Enter the video link:") | |
analyze_video_clicked = st.button("Analyze Video") | |
if analyze_video_clicked: | |
if not video_url.strip(): | |
st.warning("Please enter a valid video link.") | |
else: | |
result, accuracy, verification_links = fetch_video_metadata(video_url) | |
st.session_state["video_result"] = result | |
st.session_state["video_accuracy"] = accuracy | |
st.session_state["video_verification"] = verification_links | |
st.session_state["video_url"] = video_url # Store Video URL for Display | |
# πΉ Results Section | |
st.subheader("π Analysis Results") | |
# πΉ Text Result | |
if "text_result" in st.session_state: | |
result = st.session_state["text_result"] | |
accuracy = st.session_state["text_accuracy"] | |
if result == "Fake": | |
st.error(f"β This news is **Fake**! (Accuracy: {accuracy}%)", icon="β οΈ") | |
else: | |
st.success(f"β This news is **Real**! (Accuracy: {accuracy}%)", icon="β ") | |
st.subheader("π Trusted Fact-Checking Sources") | |
for name, link in st.session_state["text_verification"]: | |
st.markdown(f"[π {name}]({link})") | |
# πΉ Image Analysis Result Section | |
if "image_result" in st.session_state: | |
st.image(st.session_state["news_image"], caption="Uploaded Image", use_column_width=True) | |
if st.session_state["image_result"] == "Fake": | |
st.error(f"β **This image is likely Fake!** (Accuracy: {st.session_state['image_accuracy']}%)") | |
elif st.session_state["image_result"] == "Real": | |
st.success(f"β **This image is likely Real!** (Accuracy: {st.session_state['image_accuracy']}%)") | |
else: | |
st.warning("β οΈ Unable to verify the authenticity of this image.") | |
# β Add verification links | |
if st.session_state["image_verification"]: | |
st.subheader("π Trusted Fact-Checking Sources") | |
for name, link in st.session_state["image_verification"]: | |
st.markdown(f"[π {name}]({link})") | |
else: | |
st.warning("No verification sources available for this image.") | |
# πΉ Video Result | |
if "video_result" in st.session_state: | |
st.video(st.session_state["video_url"]) | |
if st.session_state["video_result"] == "Fake": | |
st.error(f"β **This video is Fake!** (Accuracy: {st.session_state['video_accuracy']}%)") | |
elif st.session_state["video_result"] == "Real": | |
st.success(f"β **This video is Real!** (Accuracy: {st.session_state['video_accuracy']}%)") | |
else: | |
st.warning("β οΈ Unable to verify the authenticity of this video.") | |
# β Check if verification links exist before iterating | |
if st.session_state["video_verification"]: | |
st.subheader("π Trusted Fact-Checking Sources") | |
for name, link in st.session_state["video_verification"]: | |
st.markdown(f"[π {name}]({link})") | |
else: | |
st.warning("No verification sources available for this video.") | |