Onedrive / app.py
sanch1tx's picture
Update app.py
846bfba verified
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(
"<center><small>Developed by: <b>Sanchit Vishwakarma</b></small></center>",
sanitize=False
)
if __name__ == "__main__":
start_server(app, host="0.0.0.0", port=7860)