from pywebio import start_server from pywebio.input import input from pywebio.output import ( put_text, put_success, put_error, put_file, put_markdown, put_buttons ) import requests, os, shutil, uuid, subprocess, threading, time, re from urllib.parse import urlparse, unquote # ============ AUTO PINGER ============= PING_URL = "https://sanch1tx-onedrive.hf.space" def auto_pinger(): while True: try: requests.get(PING_URL, timeout=10) except: pass time.sleep(300) threading.Thread(target=auto_pinger, daemon=True).start() # ============ FILENAME EXTRACTION ============ def extract_filename(response, fallback_url): cd = response.headers.get("content-disposition") if cd: m = re.search(r'filename="?([^"]+)"?', cd) if m: return m.group(1) path = urlparse(fallback_url).path name = os.path.basename(path) return unquote(name) if name else "document.docx" # ============ DOWNLOAD FROM ONEDRIVE ============ def download_file_from_onedrive(shared_url, workdir): dl = shared_url + ("&download=1" if "?" in shared_url else "?download=1") r = requests.get(dl, stream=True) r.raise_for_status() filename = extract_filename(r, shared_url) if not filename.lower().endswith(".docx"): filename += ".docx" path = os.path.join(workdir, filename) with open(path, "wb") as f: for chunk in r.iter_content(8192): if chunk: f.write(chunk) return path, filename # ============ DOCX → PDF USING LIBREOFFICE CLI ============ def convert_docx_to_pdf(docx_path, workdir): cmd = [ "soffice", "--headless", "--convert-to", "pdf:writer_pdf_Export", docx_path, "--outdir", workdir ] subprocess.run(cmd, check=True) name_pdf = os.path.basename(docx_path).replace(".docx", ".pdf") return os.path.join(workdir, name_pdf), name_pdf # ============ PYWEBIO APP ============ def app(): put_markdown("## OneDrive DOCX → PDF Converter (LibreOffice)") url = input("Paste OneDrive DOCX link") workdir = f"temp_{uuid.uuid4()}" os.makedirs(workdir, exist_ok=True) try: put_text("Downloading file…") docx_path, docx_name = download_file_from_onedrive(url, workdir) put_success(f"Downloaded: {docx_name}") put_text("Converting to PDF…") pdf_path, pdf_name = convert_docx_to_pdf(docx_path, workdir) def download_click(btn_val): with open(pdf_path, "rb") as f: put_file(pdf_name, f.read()) put_buttons(["Download PDF"], onclick=download_click) put_success("PDF ready! Click the button above.") except Exception as e: put_error(str(e)) finally: # Clean up after giving user time to download def cleanup(): time.sleep(30) shutil.rmtree(workdir, ignore_errors=True) threading.Thread(target=cleanup, daemon=True).start() put_markdown("---") put_markdown( "
Developed by: Sanchit Vishwakarma
", sanitize=False ) if __name__ == "__main__": start_server(app, host="0.0.0.0", port=7860)