File size: 7,025 Bytes
9228cad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from pathlib import Path

import streamlit as st
from googlesearch import search
import pandas as pd
import os
from rag_sec.document_search_system import DocumentSearchSystem
from chainguard.blockchain_logger import BlockchainLogger
from PIL import Image
from itertools import cycle

# Blockchain Logger
blockchain_logger = BlockchainLogger()

# Directory for storing uploaded files
UPLOAD_DIR = "uploaded_files"
os.makedirs(UPLOAD_DIR, exist_ok=True)

# Initialize DocumentSearchSystem
@st.cache_resource
def initialize_system():
    """Initialize the DocumentSearchSystem and load documents."""
    system = DocumentSearchSystem(
        neo4j_uri="neo4j+s://0ca71b10.databases.neo4j.io",
        neo4j_user="neo4j",
        neo4j_password="HwGDOxyGS1-79nLeTiX5bx5ohoFSpvHCmTv8IRgt-lY"
    )
    system.retriever.load_documents()
    return system

# Initialize the system
system = initialize_system()

st.title("Memora: Secure File Upload and Search with Blockchain & Neo4j")
st.subheader("Personalized news and global updates at your fingertips")
# File Upload Section
uploaded_files = st.file_uploader("Upload your files", accept_multiple_files=True, type=['jpg', 'jpeg', 'png', 'mp4', 'avi'])

if uploaded_files:
    for uploaded_file in uploaded_files:
        # Save file locally
        file_path = os.path.join(UPLOAD_DIR, uploaded_file.name)
        with open(file_path, "wb") as f:
            f.write(uploaded_file.getbuffer())
        st.success(f"File saved locally: {file_path}")

        # Display uploaded file details
        if uploaded_file.type.startswith('image'):
            image = Image.open(uploaded_file)
            st.image(image, caption=uploaded_file.name, use_column_width=True)

        # Metadata Input
        album = st.text_input(f"Album for {uploaded_file.name}", "Default Album")
        tags = st.text_input(f"Tags for {uploaded_file.name} (comma-separated)", "")

        # Log Metadata and Transaction
        if st.button(f"Log Metadata for {uploaded_file.name}"):
            metadata = {"file_name": uploaded_file.name, "tags": tags.split(','), "album": album}
            blockchain_details = blockchain_logger.log_data(metadata)
            blockchain_hash = blockchain_details.get("block_hash", "N/A")

            # Use Neo4jHandler from DocumentSearchSystem to log the transaction
            system.neo4j_handler.log_relationships(uploaded_file.name, tags, blockchain_hash, [album])
            st.write(f"Metadata logged successfully! Blockchain Details: {blockchain_details}")

# Blockchain Integrity Validation
if st.button("Validate Blockchain Integrity"):
    is_valid = blockchain_logger.is_blockchain_valid()
    st.write("Blockchain Integrity:", "Valid βœ…" if is_valid else "Invalid ❌")

# Document Search Section
st.subheader("Search Documents")

# Google Search: User-Specific News
st.subheader("1. Latest News About You")
user_name = st.text_input("Enter your name or handle to search for recent news", value="Talex Maxim")

if st.button("Search News About Me"):
    if user_name:
        st.write(f"Searching Google for news about **{user_name}**...")
        try:
            results = list(search(user_name, num_results=5))
            if results:
                st.success(f"Top {len(results)} results for '{user_name}':")
                user_news_data = {"URL": results}
                df_user_news = pd.DataFrame(user_news_data)
                st.dataframe(df_user_news)
            else:
                st.warning("No recent news found about you.")
        except Exception as e:
            st.error(f"An error occurred during the search: {str(e)}")
    else:
        st.warning("Please enter your name or handle to search.")

# Google Search: Global News Categories
categories = ["Technology", "Sports", "Politics", "Entertainment", "Science"]

st.title("Global News Insights")

# News Results Dictionary
news_results = {}

try:
    # Fetch News for Each Category
    for category in categories:
        try:
            news_results[category] = list(search(f"latest {category} news", num_results=3))
        except Exception as e:
            news_results[category] = [f"Error fetching news: {str(e)}"]

    # Display Results with Styled Buttons
    for category, articles in news_results.items():
        st.subheader(f"{category} News")
        cols = st.columns(3)  # Create 3 columns for the layout

        if articles and "Error fetching news" not in articles[0]:
            for idx, article in enumerate(articles):
                with cols[idx % 3]:  # Cycle through columns
                    st.markdown(
                        f"""
                        <div style="padding: 10px; border: 1px solid #ccc; border-radius: 5px; margin: 10px; text-align: center;">
                            <a href="{article}" target="_blank" style="text-decoration: none;">
                                <button style="background-color: #c4ccc8; color: white; border: none; padding: 10px 20px; text-align: center; display: inline-block; font-size: 16px; border-radius: 5px;">
                                    {category}-{idx + 1}
                                </button>
                            </a>
                        </div>
                        """,
                        unsafe_allow_html=True,
                    )
        else:
            st.warning(f"Could not fetch news for **{category}**.")
except Exception as e:
    st.error(f"An unexpected error occurred: {str(e)}")


    #     # Display results
    #     for category, articles in news_results.items():
    #         st.write(f"### Top News in {category}:")
    #         for idx, article in enumerate(articles, start=1):
    #             st.write(f"{idx}. [Read here]({article})")
    # except Exception as e:
    #     st.error(f"An error occurred while fetching global news: {str(e)}")

# Document Search
st.subheader("3. Search Documents")
query = st.text_input("Enter your query (e.g., 'sports news', 'machine learning')")

if st.button("Search Documents"):
    if query:
        result = system.process_query(query)
        if result["status"] == "success":
            st.success(f"Query processed successfully!")
            st.write("### Query Response:")
            st.write(result["response"])
            st.write("### Retrieved Documents:")
            for idx, doc in enumerate(result["retrieved_documents"], start=1):
                st.write(f"**Document {idx}:**")
                st.write(doc[:500])  # Display the first 500 characters
            st.write("### Blockchain Details:")
            st.json(result["blockchain_details"])
        elif result["status"] == "no_results":
            st.warning("No relevant documents found for your query.")
        elif result["status"] == "rejected":
            st.error(result["message"])
    else:
        st.warning("Please enter a query to search.")

# Debugging Section
if st.checkbox("Show Debug Information"):
    st.write(f"Total documents loaded: {len(system.retriever.documents)}")