Spaces:
Running
Running
import streamlit as st | |
import os | |
from PIL import Image | |
from googleapiclient.discovery import build | |
from googleapiclient.http import MediaFileUpload | |
from google.oauth2.credentials import Credentials | |
from neo4j import GraphDatabase | |
from chainguard.blockchain_logger import BlockchainLogger | |
# Blockchain Logger | |
blockchain_logger = BlockchainLogger() | |
# Neo4j Handler | |
class Neo4jHandler: | |
def __init__(self, uri, user, password): | |
self.driver = GraphDatabase.driver(uri, auth=(user, password)) | |
def close(self): | |
self.driver.close() | |
def log_transaction(self, file_name, drive_id, blockchain_hash): | |
"""Log transactions to Neo4j.""" | |
with self.driver.session() as session: | |
session.write_transaction(self._create_transaction_node, file_name, drive_id, blockchain_hash) | |
def _create_transaction_node(tx, file_name, drive_id, blockchain_hash): | |
tx.run( | |
""" | |
MERGE (t:Transaction {file_name: $file_name, drive_id: $drive_id, blockchain_hash: $blockchain_hash}) | |
RETURN t | |
""", | |
file_name=file_name, drive_id=drive_id, blockchain_hash=blockchain_hash | |
) | |
# Google Drive Integration | |
def get_drive_service(): | |
creds = Credentials.from_authorized_user_file("credentials.json", scopes=["https://www.googleapis.com/auth/drive.file"]) | |
return build('drive', 'v3', credentials=creds) | |
drive_service = get_drive_service() | |
def upload_to_google_drive(file_path, folder_id): | |
"""Uploads a file to Google Drive.""" | |
file_metadata = {'name': os.path.basename(file_path), 'parents': [folder_id]} | |
media = MediaFileUpload(file_path, resumable=True) | |
file = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute() | |
return file.get('id') | |
# Metadata Logging | |
def log_metadata(file_name, tags, album): | |
"""Log metadata to Chagu blockchain.""" | |
metadata = {"file_name": file_name, "tags": tags, "album": album} | |
block_details = blockchain_logger.log_data(metadata) | |
return block_details | |
# Streamlit Layout | |
st.title("Memora: Secure File Upload with Blockchain & Neo4j") | |
st.subheader("Securely upload, organize, and query your files") | |
# File Upload | |
uploaded_files = st.file_uploader("Upload your files", accept_multiple_files=True, type=['jpg', 'jpeg', 'png', 'mp4', 'avi']) | |
if uploaded_files: | |
# Neo4j Setup | |
neo4j_handler = Neo4jHandler( | |
uri="neo4j+s://0ca71b10.databases.neo4j.io", | |
user="neo4j", | |
password="HwGDOxyGS1-79nLeTiX5bx5ohoFSpvHCmTv8IRgt-lY" | |
) | |
folder_id = st.text_input("Enter Google Drive Folder ID", "") | |
for uploaded_file in uploaded_files: | |
# Save file locally | |
file_path = os.path.join("uploads", uploaded_file.name) | |
os.makedirs("uploads", exist_ok=True) | |
with open(file_path, "wb") as f: | |
f.write(uploaded_file.getbuffer()) | |
st.success(f"File saved locally: {file_path}") | |
# Display 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)", "") | |
if st.button(f"Log Metadata for {uploaded_file.name}"): | |
metadata = log_metadata(uploaded_file.name, tags.split(','), album) | |
st.write(f"Metadata logged successfully! Blockchain Details: {metadata}") | |
# Upload to Google Drive | |
if folder_id and st.button(f"Upload {uploaded_file.name} to Google Drive"): | |
try: | |
drive_id = upload_to_google_drive(file_path, folder_id) | |
blockchain_hash = metadata.get('block_hash', 'N/A') | |
neo4j_handler.log_transaction(uploaded_file.name, drive_id, blockchain_hash) | |
st.success(f"File uploaded to Google Drive: File ID {drive_id}") | |
except Exception as e: | |
st.error(f"Failed to upload {uploaded_file.name} to Google Drive: {str(e)}") | |
neo4j_handler.close() | |
# 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 β") | |
# Query System | |
st.subheader("Query Files") | |
query = st.text_input("Enter your query (e.g., 'Good comedy')") | |
if st.button("Search"): | |
# Simulating query processing | |
result = {"response": f"Mock result for '{query}'"} | |
st.write(f"Query Result: {result['response']}") | |