Spaces:
Paused
Paused
| echo "[boot] Configuring Kaggle credentials..." | |
| if [ -n "$KAGGLE_USERNAME" ] && [ -n "$KAGGLE_KEY" ]; then | |
| mkdir -p ~/.kaggle | |
| printf '{"username":"%s","key":"%s"}' "$KAGGLE_USERNAME" "$KAGGLE_KEY" > ~/.kaggle/kaggle.json | |
| chmod 600 ~/.kaggle/kaggle.json | |
| fi | |
| echo "[boot] Configuring YouTube client secrets..." | |
| if [ -n "$YOUTUBE_CLIENT_ID" ] && [ -n "$YOUTUBE_CLIENT_SECRET" ]; then | |
| python3 -c " | |
| import json,os | |
| d={'installed':{'client_id':os.environ['YOUTUBE_CLIENT_ID'],'project_id':'yt-ai-bot','auth_uri':'https://accounts.google.com/o/oauth2/auth','token_uri':'https://oauth2.googleapis.com/token','auth_provider_x509_cert_url':'https://www.googleapis.com/oauth2/v1/certs','client_secret':os.environ['YOUTUBE_CLIENT_SECRET'],'redirect_uris':['http://localhost']}} | |
| open('/app/client_secrets.json','w').write(json.dumps(d)) | |
| print('[boot] client_secrets.json written')" | |
| fi | |
| echo "[boot] Pulling state from HF Dataset..." | |
| python3 -c " | |
| import sys; sys.path.insert(0,'/app') | |
| try: | |
| from sync_hub import pull_state | |
| from pathlib import Path | |
| pull_state(Path('/app')) | |
| except Exception as e: | |
| print(f'[boot] Hub pull skipped: {e}') | |
| " | |
| echo "[boot] Starting nginx..." | |
| nginx | |
| echo "[boot] Starting Ollama..." | |
| OLLAMA_HOST=127.0.0.1 ollama serve & | |
| echo "[boot] Starting status server on port 8080..." | |
| python3 -c " | |
| import http.server, threading, os, time | |
| class Handler(http.server.BaseHTTPRequestHandler): | |
| def do_GET(self): | |
| try: | |
| log = open('/app/pipeline.log').read()[-3000:] | |
| except: | |
| log = 'No log yet.' | |
| body = f'''<!DOCTYPE html><html><head><meta charset=utf-8> | |
| <meta http-equiv=refresh content=30> | |
| <title>YT Pipeline</title> | |
| <style>body{{font-family:monospace;background:#111;color:#0f0;padding:20px}} | |
| pre{{background:#000;padding:10px;overflow-x:auto;white-space:pre-wrap}}</style> | |
| </head><body> | |
| <h2>YouTube Shorts Pipeline</h2> | |
| <p>Space is running. Pipeline log (last 3000 chars, auto-refreshes every 30s):</p> | |
| <pre>{log}</pre> | |
| </body></html>'''.encode() | |
| self.send_response(200) | |
| self.send_header('Content-Type','text/html') | |
| self.send_header('Content-Length',str(len(body))) | |
| self.end_headers() | |
| self.wfile.write(body) | |
| def log_message(self, *a): pass | |
| httpd = http.server.HTTPServer(('0.0.0.0', 8080), Handler) | |
| print('[status] Server running on port 8080') | |
| httpd.serve_forever() | |
| " & | |
| echo "[boot] Waiting for Ollama..." | |
| for i in $(seq 1 60); do | |
| if curl -sf http://127.0.0.1:11434/api/tags > /dev/null 2>&1; then | |
| echo "[boot] Ollama ready after ${i}s"; break | |
| fi | |
| sleep 2 | |
| done | |
| echo "[boot] Pulling qwen2.5-coder:7b-instruct..." | |
| ollama pull qwen2.5-coder:7b-instruct | |
| echo "[boot] Starting pipeline..." | |
| python3 /app/automation.py >> /app/pipeline.log 2>&1 & | |
| echo "[boot] Pipeline PID: $!" | |
| echo "[boot] Trying OpenClaw (optional)..." | |
| export OLLAMA_HOST=http://127.0.0.1:11434 | |
| openclaw gateway start || echo "[boot] OpenClaw unavailable, status server is active" | |
| sleep infinity | |