Spaces:
Running
Running
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}" | |
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() |