Spaces:
Paused
Paused
| 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) | |