TruthCheck / app.py
adnaan05's picture
Update app.py (#54)
5e77a53 verified
import sys
from pathlib import Path
import os
import gdown
import streamlit as st
# Set page config - must be first Streamlit command
st.set_page_config(
page_title="TruthCheck - Advanced Fake News Detector",
page_icon="πŸ›‘οΈ",
layout="wide",
initial_sidebar_state="expanded"
)
# Custom CSS with Poppins font
st.markdown("""
<style>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
* {
font-family: 'Poppins', sans-serif !important;
box-sizing: border-box;
}
.stApp {
background: #ffffff;
min-height: 100vh;
color: #1f2a44;
margin: 0 !important;
padding: 0 !important;
}
.sidebar .sidebar-content {
background-color: #F4F7FA;
padding: 1rem;
}
.stButton>button {
background-color: #4B5EAA;
color: white;
border-radius: 8px;
padding: 0.5rem 1rem;
font-weight: 600;
transition: background-color 0.3s;
}
.stButton>button:hover {
background-color: #3A4A8C;
}
.stTextArea textarea {
border: 1px solid #E0E0E0;
border-radius: 8px;
padding: 1rem;
}
/* Enhanced sidebar styling */
.stRadio > div {
gap: 0.5rem;
}
.stRadio > div > label {
padding: 0.5rem 1rem;
border-radius: 8px;
transition: all 0.3s ease;
cursor: pointer;
font-weight: 500;
}
.stRadio > div > label:hover {
background-color: #E8F0FE;
transform: translateX(5px);
}
.stRadio > div > label[data-checked="true"] {
background-color: #4B5EAA;
color: white;
}
</style>
""", unsafe_allow_html=True)
MODEL_PATH = "models/saved/final_model.pt"
GOOGLE_DRIVE_FILE_ID = "1xhYKuC5_Yri3mm3Ejt-SpB2WAVUTJvc_"
GOOGLE_DRIVE_URL = f"https://drive.google.com/uc?id={GOOGLE_DRIVE_FILE_ID}"
@st.cache_resource
def download_model():
"""Download model from Google Drive if not exists."""
if not os.path.exists(MODEL_PATH):
os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True)
with st.spinner("Downloading model from Google Drive..."):
try:
gdown.download(GOOGLE_DRIVE_URL, MODEL_PATH, quiet=False)
st.markdown('<div class="flash-message success-message">Model downloaded successfully!</div>', unsafe_allow_html=True)
except Exception as e:
st.markdown(f'<div class="flash-message error-message">Failed to download model: {str(e)}</div>', unsafe_allow_html=True)
st.markdown('<div class="flash-message error-message">Please check your Google Drive link and ensure the file is publicly accessible.</div>', unsafe_allow_html=True)
return False
return True
# Add src directory to Python path
src_path = Path(__file__).parent / "src"
sys.path.append(str(src_path))
# Enhanced Sidebar navigation with icons
st.sidebar.markdown("""
<div style="text-align: center; margin-bottom: 2rem;">
<div style="font-size: 3rem; margin-bottom: 0.5rem;">πŸ›‘οΈ</div>
<h1 style="color: #4B5EAA; font-size: 1.8rem; font-weight: 700; margin-bottom: 0.5rem; line-height: 1.2;">
TruthCheck
</h1>
<p style="color: #666; font-size: 1rem; margin: 0; font-weight: 300; line-height: 1.3;">
Advanced Fake News Detector
</p>
</div>
""", unsafe_allow_html=True)
st.sidebar.markdown("---")
# Navigation with icons
page = st.sidebar.radio(
"Navigate",
[
"🏠 Home",
"ℹ️ About",
"πŸ†“ Open Source",
"πŸ“‹ Terms of Use",
"πŸ”’ Privacy Policy",
"πŸ“¬ Contact"
],
label_visibility="collapsed",
key="navigation"
)
# Add some spacing and additional info
st.sidebar.markdown("---")
st.sidebar.markdown("""
<div style="text-align: center; padding: 1.5rem; background: linear-gradient(135deg, #F8F9FA 0%, #E8F0FE 100%); border-radius: 12px; margin-top: 1rem; border: 1px solid #E0E7FF;">
<div style="font-size: 2rem; margin-bottom: 0.8rem;">πŸ”</div>
<p style="font-size: 0.85rem; color: #4B5EAA; margin: 0; font-weight: 500; line-height: 1.4;">
Protecting you from misinformation with AI-powered detection
</p>
</div>
""", unsafe_allow_html=True)
# Add footer info in sidebar only
st.sidebar.markdown("""
<div style="text-align: center; padding: 0.5rem; margin-top: 2rem;">
<p style="font-size: 0.7rem; color: #888; margin: 0;">
Β© 2025 TruthCheck | AI-Powered
</p>
</div>
""", unsafe_allow_html=True)
# Clean up the page variable to remove icons for the conditional logic
page_clean = page.split(" ", 1)[1] if " " in page else page
if __name__ == "__main__":
if page_clean == "Home":
if download_model():
from src.app import main
main()
else:
st.markdown('<div class="flash-message error-message">Cannot start the application without the model file.</div>', unsafe_allow_html=True)
elif page_clean == "About":
from src.about import main
main()
elif page_clean == "Open Source":
from src.opensource import main
main()
elif page_clean == "Terms of Use":
from src.terms_of_use import main
main()
elif page_clean == "Privacy Policy":
from src.privacy_policy import main
main()
elif page_clean == "Contact":
from src.contact import main
main()