Spaces:
Runtime error
Runtime error
Download app-1.py from bradcharl14/AutoContentForge-AI: direct link, hf CLI and curl.
- Browser
- Download file 10.7 kB
-
https://huggingface.co/spaces/bradcharl14/AutoContentForge-AI/resolve/main/app-1.py
- Command line
-
hf download hf://spaces/bradcharl14/AutoContentForge-AI/app-1.py
-
curl -L -o app-1.py https://huggingface.co/spaces/bradcharl14/AutoContentForge-AI/resolve/main/app-1.py
10.7 kB
| import streamlit as st | |
| from streamlit_calendar import calendar | |
| from utils import ContentExtractor, ForgeAI | |
| import pandas as pd | |
| # Page Config | |
| st.set_page_config( | |
| page_title="AutoContentForge AI", | |
| page_icon="⚒️", | |
| layout="wide", | |
| initial_sidebar_state="expanded", | |
| ) | |
| # Initialize ForgeAI | |
| forge = ForgeAI() | |
| # Session State for Content | |
| if 'forge_results' not in st.session_state: | |
| st.session_state.forge_results = None | |
| if 'extracted_content' not in st.session_state: | |
| st.session_state.extracted_content = None | |
| # Custom CSS for Premium Look | |
| st.markdown(""" | |
| <style> | |
| /* Global Text Color */ | |
| .stApp { | |
| color: #ffffff; | |
| } | |
| .main { | |
| background-color: #0e1117; | |
| color: #ffffff; | |
| } | |
| p, span, label, h1, h2, h3, h4, h5, h6 { | |
| color: #ffffff !important; | |
| } | |
| .stTabs [data-baseweb="tab-list"] { | |
| gap: 24px; | |
| background-color: transparent; | |
| } | |
| .stTabs [data-baseweb="tab"] { | |
| height: 50px; | |
| white-space: pre-wrap; | |
| background-color: #1a1c24; | |
| border-radius: 4px 4px 0px 0px; | |
| color: #ffffff !important; | |
| font-size: 16px; | |
| font-weight: 500; | |
| padding: 10px 20px; | |
| } | |
| .stTabs [aria-selected="true"] { | |
| background-color: #6d28d9 !important; | |
| border-bottom: 2px solid #8b5cf6 !important; | |
| } | |
| .pro-glass-card { | |
| background: rgba(255, 255, 255, 0.05); | |
| backdrop-filter: blur(10px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| border-radius: 12px; | |
| padding: 20px; | |
| margin-bottom: 20px; | |
| color: #ffffff; | |
| } | |
| .platform-card { | |
| background: #1a1c24; | |
| border-left: 5px solid #6d28d9; | |
| padding: 15px; | |
| border-radius: 8px; | |
| margin-bottom: 10px; | |
| color: #ffffff; | |
| } | |
| .sidebar-pro-cta { | |
| background: linear-gradient(135deg, #6d28d9, #9333ea); | |
| color: white !important; | |
| padding: 15px; | |
| border-radius: 8px; | |
| text-align: center; | |
| margin-top: 20px; | |
| } | |
| .sidebar-pro-cta small, .sidebar-pro-cta strong { | |
| color: white !important; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Sidebar Branding & Pro CTA | |
| with st.sidebar: | |
| st.title("⚒️ AutoContentForge AI") | |
| st.caption("Automate Your Content. Forge Every Platform.") | |
| st.markdown("---") | |
| st.markdown(""" | |
| <div class="sidebar-pro-cta"> | |
| <strong>🚀 Upgrade to Pro</strong><br> | |
| <small>Self-Hosted Docker Version</small><br> | |
| <br> | |
| • Direct Social Posting<br> | |
| • Full Bulk Scheduling<br> | |
| • Video Automation<br> | |
| • Google Docs sync | |
| </div> | |
| """, unsafe_allow_html=True) | |
| if st.button("Contact for Pro Version", use_container_width=True): | |
| st.info("Email: rajue@smackcoders.com with subject 'AutoContentForge AI Pro Inquiry'") | |
| st.markdown("---") | |
| st.markdown("### Resources") | |
| st.markdown("[Documentation](#)") | |
| st.markdown("[Pricing](#)") | |
| st.markdown("[YouTube Channel](#)") | |
| # Main Navigation Tabs | |
| tab1, tab2, tab3 = st.tabs([ | |
| "📝 Single Post", | |
| "📦 Bulk Posting", | |
| "⚙️ Admin Settings" | |
| ]) | |
| # Initialize session states for the new workflow | |
| if 'master_variations' not in st.session_state: | |
| st.session_state.master_variations = None | |
| if 'selected_variation' not in st.session_state: | |
| st.session_state.selected_variation = None | |
| if 'current_hashtags' not in st.session_state: | |
| st.session_state.current_hashtags = "" | |
| # Module 1: Single Post | |
| with tab1: | |
| st.header("📝 Create Single Social Post") | |
| st.write("Fetch from a URL or use the manual editor to forge your master variations.") | |
| col_in, col_out = st.columns([1, 1.2]) | |
| with col_in: | |
| st.subheader("1. Source Content") | |
| input_mode = st.radio("Input Mode", ["URL Fetch", "Manual Editor"], horizontal=True) | |
| if input_mode == "URL Fetch": | |
| source_url = st.text_input("Enter Content URL", placeholder="https://example.com/blog-post") | |
| if st.button("🚀 Fetch & Analyze"): | |
| if not source_url or "://" not in source_url: | |
| st.error("Please enter a valid URL (including https://)") | |
| else: | |
| with st.spinner("Forging 3 master variations..."): | |
| extracted = ContentExtractor.from_url(source_url) | |
| if "error" in extracted: | |
| st.error(extracted["error"]) | |
| else: | |
| st.session_state.extracted_content = extracted | |
| st.session_state.master_variations = forge.generate_master_variations(extracted['text']) | |
| st.session_state.current_hashtags = forge.extract_hashtags(extracted['text']) | |
| st.session_state.selected_variation = None # Reset selection | |
| st.success("Successfully generated 3 variations!") | |
| else: | |
| pasted_title = st.text_input("Post Title (Optional)") | |
| pasted_text = st.text_area("Master Content / Article Text", height=200) | |
| if st.button("✨ Generate Variations"): | |
| if len(pasted_text) < 50: | |
| st.warning("Please provide more content for better AI results.") | |
| else: | |
| with st.spinner("Processing..."): | |
| st.session_state.extracted_content = {"title": pasted_title or "Manual Input", "text": pasted_text} | |
| st.session_state.master_variations = forge.generate_master_variations(pasted_text) | |
| st.session_state.current_hashtags = forge.extract_hashtags(pasted_text) | |
| st.session_state.selected_variation = None | |
| st.success("Variations generated!") | |
| if st.session_state.master_variations: | |
| st.markdown("---") | |
| st.subheader("2. Choose Master Variation") | |
| st.write("Select the style that best fits your intent:") | |
| for var in st.session_state.master_variations: | |
| with st.expander(f"🔹 {var['type']}", expanded=(st.session_state.selected_variation == var['id'])): | |
| st.write(var['text']) | |
| if st.button(f"Select {var['type']}", key=f"sel_{var['id']}"): | |
| st.session_state.selected_variation = var['id'] | |
| st.rerun() | |
| with col_out: | |
| st.subheader("3. Preview & Adapt") | |
| if not st.session_state.selected_variation: | |
| st.info("Select a master variation on the left to see platform-specific previews.") | |
| else: | |
| selected_var_obj = next(v for v in st.session_state.master_variations if v['id'] == st.session_state.selected_variation) | |
| platforms = st.multiselect("Select Social Networks", | |
| ["LinkedIn", "Twitter/X", "Instagram", "Facebook", "YouTube", "Bluesky"], | |
| default=["LinkedIn", "Twitter/X"]) | |
| if st.session_state.extracted_content.get("images"): | |
| st.image(st.session_state.extracted_content['images'][0], caption="Extracted Media", width=300) | |
| else: | |
| st.write("📸 *No media found. You can add media in the Pro version or manual editor.*") | |
| st.markdown("---") | |
| for platform in platforms: | |
| adapted_text = forge.adapt_for_platform(selected_var_obj['text'], platform, st.session_state.current_hashtags) | |
| with st.container(): | |
| st.markdown(f""" | |
| <div class="platform-card"> | |
| <strong>{platform} Preview</strong><br> | |
| <p style='font-size: 0.9em; color: #ccc;'> | |
| {adapted_text if isinstance(adapted_text, str) else adapted_text.get('title')} | |
| </p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| if isinstance(adapted_text, dict) and platform == "YouTube": | |
| st.caption(f"Description: {adapted_text.get('description')}") | |
| if st.button("📅 Post / Schedule Now", type="primary"): | |
| st.success("✅ Successfully queued! (Flow simulation)") | |
| st.balloons() | |
| st.info("🔒 In Pro: This would instantly publish or sync to your drag-and-drop calendar.") | |
| # Module 2: Bulk Posting | |
| with tab2: | |
| st.header("📦 Bulk URL Posting") | |
| st.write("Forge content from multiple URLs at once. Perfect for content migration or high-volume publishing.") | |
| bulk_urls = st.text_area("List of URLs (one per line)", height=250, placeholder="https://site.com/post-1\nhttps://site.com/post-2") | |
| st.markdown(""" | |
| <div class="pro-glass-card"> | |
| <strong>Pro Feature Highlights:</strong><br> | |
| • Automatic batch processing of sitemaps<br> | |
| • Intelligent image matching for bulk lists<br> | |
| • Scheduled intervals (e.g., 1 post every 2 hours)<br> | |
| • CSV / JSON Export for external schedulers | |
| </div> | |
| """, unsafe_allow_html=True) | |
| st.button("🚀 Process Bulk List", disabled=True) | |
| st.markdown("---") | |
| if st.button("Unlock Bulk & Automation", key="bulk_pro"): | |
| st.info("Email: rajue@smackcoders.com with subject 'AutoContentForge AI Pro Inquiry'") | |
| # Module 3: Admin Settings | |
| with tab3: | |
| st.header("⚙️ Admin Settings") | |
| st.write("Authorize and manage your social network connections.") | |
| networks = [ | |
| {"name": "LinkedIn", "icon": "👔"}, | |
| {"name": "Twitter/X", "icon": "🐦"}, | |
| {"name": "Instagram", "icon": "📸"}, | |
| {"name": "Facebook", "icon": "👥"}, | |
| {"name": "YouTube", "icon": "🎥"}, | |
| {"name": "Bluesky", "icon": "🦋"} | |
| ] | |
| cols = st.columns(3) | |
| for i, net in enumerate(networks): | |
| with cols[i % 3]: | |
| st.markdown(f"### {net['icon']} {net['name']}") | |
| st.button(f"Authorize {net['name']}", key=f"auth_btn_{net['name']}") | |
| st.caption(f"Status: Not Connected") | |
| st.markdown("---") | |
| st.subheader("Global Settings") | |
| st.checkbox("Auto-add smart hashtags to all posts", value=True) | |
| st.checkbox("Notify me on successful publishing", value=True) | |
| st.selectbox("Default AI Tone", ["Professional", "Conversational", "Exciting", "Detailed"]) | |
| if st.button("Save Settings"): | |
| st.success("Settings saved locally! (Simulation)") | |