CloudDriveSN / app.py
Pabasara SN
Update app.py
e3eb79c verified
Raw
History Blame Contribute Delete
6.31 kB
import gradio as gr
import os
import shutil
import json
from pathlib import Path
from datetime import datetime
# ================================================
# πŸ”₯ PUNGAGO CLOUD DRIVE - ADVANCED PRO EDITION πŸ”₯
# Refined by Nexi for Pabasara SN
# ================================================
STORAGE_DIR = "vault_storage"
METADATA_FILE = "vault_metadata.json"
for d in [STORAGE_DIR]:
if not os.path.exists(d):
os.makedirs(d)
# Initialize or Load Social Data (Likes/Comments)
def load_metadata():
if os.path.exists(METADATA_FILE):
with open(METADATA_FILE, "r") as f:
return json.load(f)
return {}
def save_metadata(data):
with open(METADATA_FILE, "w") as f:
json.dump(data, f)
def get_current_theme():
"""Dynamic Dark Mode for 2026"""
return gr.themes.Soft(
primary_hue="rose",
secondary_hue="violet",
neutral_hue="slate",
font=["Inter", "sans-serif"]
)
def get_file_list():
metadata = load_metadata()
files = []
for f in os.listdir(STORAGE_DIR):
f_path = os.path.join(STORAGE_DIR, f)
stats = os.stat(f_path)
size = f"{round(stats.st_size / (1024 * 1024), 2)} MB"
# Get likes from metadata or default to 0
likes = metadata.get(f, {}).get("likes", 0)
files.append([f, size, f"❀️ {likes}"])
return files
def upload_files(files):
if not files:
return get_file_list(), "❌ Selection empty."
for file in files:
dest_path = os.path.join(STORAGE_DIR, os.path.basename(file.name))
shutil.copy(file.name, dest_path)
return get_file_list(), f"βœ… {len(files)} files added to the vault! πŸ”₯"
def handle_social_action(filename, action_type, comment_text=None):
metadata = load_metadata()
if filename not in metadata:
metadata[filename] = {"likes": 0, "comments": []}
if action_type == "like":
metadata[filename]["likes"] += 1
elif action_type == "comment" and comment_text:
timestamp = datetime.now().strftime("%H:%M")
metadata[filename]["comments"].append(f"[{timestamp}] {comment_text}")
save_metadata(metadata)
# Format comments for display
comment_feed = "\n".join(metadata[filename]["comments"][-10:]) # Show last 10
return f"❀️ {metadata[filename]['likes']}", comment_feed, get_file_list()
def preview_file(evt: gr.SelectData):
filename = evt.value[0] if isinstance(evt.value, list) else evt.value
file_path = os.path.join(STORAGE_DIR, filename)
ext = Path(file_path).suffix.lower()
metadata = load_metadata()
file_data = metadata.get(filename, {"likes": 0, "comments": []})
video, image, comments = None, None, "\n".join(file_data["comments"])
likes = f"❀️ {file_data['likes']}"
if ext in ['.mp4', '.webm', '.mov']:
video = file_path
elif ext in ['.jpg', '.jpeg', '.png', '.gif', '.webp']:
image = file_path
return video, image, filename, likes, comments
# CSS for the "Twitter/YouTube" Vibe
custom_css = """
.gradio-container { background: #0f0c29; background: linear-gradient(to bottom, #0f0c29, #302b63, #24243e); color: white; }
.upload-area { border: 2px dashed #ff0066 !important; border-radius: 20px !important; }
.stat-card { background: rgba(255, 255, 255, 0.1); border-radius: 15px; padding: 15px; border-left: 5px solid #ff0066; }
.comment-box { background: rgba(0,0,0,0.3); border-radius: 10px; font-family: monospace; }
button.primary { background: linear-gradient(90deg, #ff0066, #c026d3) !important; border: none !important; }
"""
with gr.Blocks(theme=get_current_theme(), css=custom_css, title="Pungago Pro Vault") as demo:
gr.Markdown("# πŸ‘ PUNGAGO NSFW CLOUD DRIVE `v2.0` ")
with gr.Tabs():
with gr.Tab("πŸ“± Social Feed & Player"):
with gr.Row():
with gr.Column(scale=2):
v_player = gr.Video(label="Now Playing", interactive=False, height=500)
i_player = gr.Image(label="HD Preview", interactive=False, height=500, visible=False)
with gr.Row(elem_classes="stat-card"):
current_file = gr.Textbox(label="Active File", interactive=False)
like_count = gr.Label(value="❀️ 0", label="Engagement", show_label=False)
like_btn = gr.Button("πŸ”₯ Drop a Like", variant="primary")
comment_display = gr.Textbox(label="Recent Comments", lines=5, elem_classes="comment-box", interactive=False)
with gr.Row():
comment_input = gr.Textbox(show_label=False, placeholder="Add a comment...")
post_btn = gr.Button("πŸ’¬ Post", scale=0)
with gr.Column(scale=1):
gr.Markdown("### πŸ—„οΈ Your Library")
vault_table = gr.DataFrame(
headers=["Filename", "Size", "Popularity"],
value=get_file_list(),
interactive=False,
label="Click to play"
)
refresh_btn = gr.Button("πŸ”„ Sync Vault")
with gr.Tab("πŸ“€ Rapid Upload"):
uploader = gr.File(label="Upload Multi-Media", file_count="multiple", elem_classes="upload-area")
status = gr.Markdown("Ready for new content...")
up_btn = gr.Button("πŸš€ Start Permanent Sync", variant="primary")
# LOGIC
vault_table.select(preview_file, None, [v_player, i_player, current_file, like_count, comment_display])
like_btn.click(
handle_social_action,
inputs=[current_file, gr.State("like")],
outputs=[like_count, comment_display, vault_table]
)
post_btn.click(
handle_social_action,
inputs=[current_file, gr.State("comment"), comment_input],
outputs=[like_count, comment_display, vault_table]
).then(lambda: "", None, comment_input) # Clear input after post
up_btn.click(upload_files, uploader, [vault_table, status])
refresh_btn.click(get_file_list, None, vault_table)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)