bookshine / app.py
Alexander Seifert
embed presentation
e89c6c7
import base64
import hashlib
import requests
import os
import streamlit as st
BOOKSHINE_HOST = 'https://api.bookshine.at'
BOOKSHINE_PORT = '4690'
PASSWORDS = [p.lower() for p in os.environ.get("PASSWORDS", "").split(",")]
PITCH_EMBED = """<iframe src="https://pitch.com/embed/38e99a83-1de6-4866-a515-dd3954c473e5" allow="fullscreen" allowfullscreen="" width="560" height="368" style="border:0"></iframe>"""
def password_is_correct(password):
return password.lower() in PASSWORDS
def process_docx(uploaded_file):
# Read and encode file contents
encoded_file = base64.b64encode(uploaded_file.read()).decode('utf-8')
payload = {
"filename": uploaded_file.name,
"attachment_b64": encoded_file,
"include_diff": True,
"include_docx": True,
"include_commas": True,
"is_demo": False,
}
response = requests.post(f'{BOOKSHINE_HOST}:{BOOKSHINE_PORT}/process_md', json=payload)
# Decode response and create download link
if response.ok:
response = response.json()
# make corrected docx available for download
decoded_file = base64.b64decode(response['docx'])
out_name = uploaded_file.name.replace('.docx', '-bookshine.docx')
st.download_button('✅ Korrigierten Umbruch herunterladen', data=decoded_file, file_name=out_name)
# show diff
diff = response["diff"].replace("&para;", "&nbsp;")
diff = diff.replace("<ins>", "<ins style='background-color: #c8e6c9; text-decoration: underline;'>")
st.write(diff, unsafe_allow_html=True)
else:
st.error('Es ist ein Fehler aufgetreten')
return
def process_pdf(uploaded_file):
# Read and encode file contents
encoded_file = base64.b64encode(uploaded_file.read()).decode('utf-8')
# md5 encode file contents
md5 = hashlib.md5(encoded_file.encode()).hexdigest()
payload = {
"attachment_id": md5,
"attachment_b64": encoded_file,
}
response = requests.post(f'{BOOKSHINE_HOST}:{BOOKSHINE_PORT}/process_umbruch', json=payload)
# Decode response and create download link
if response.ok:
response = response.json()
# trennungen = [a for a in response["annotations"] if a["type"] == "TRENNUNG"]
b64 = response['annotated']
decoded_file = base64.b64decode(b64)
out_name = uploaded_file.name.replace('.pdf', '-bookshine.pdf')
st.download_button('✅ Report herunterladen', data=decoded_file, file_name=out_name)
# show pdf
pdf_display = f'<iframe src="data:application/pdf;base64,{b64}" width="800" height="800" type="application/pdf"></iframe>'
st.write(pdf_display, unsafe_allow_html=True)
else:
st.error('Es ist ein Fehler aufgetreten')
def main():
st.write("<div><span style='margin-left: 250px; font-size: 5em; color: black;'>❧</span>&nbsp;</div>", unsafe_allow_html=True)
st.write(PITCH_EMBED, unsafe_allow_html=True)
st.markdown("<br/>", unsafe_allow_html=True)
st.subheader('Überzeugen Sie sich selbst')
if "in_progress" not in st.session_state:
st.session_state.in_progress = False
# st.write("Bitte geben Sie die E-Mail-Adresse an, an die Sie die Resultate geschickt haben wollen.")
uploaded_file = st.file_uploader('Manuskript (.docx) oder Umbruch (.pdf) hochladen', type=['docx', 'pdf'], accept_multiple_files=False)
if not uploaded_file:
return
password = st.text_input("Zugriffscode").lower()
process_button_name = "✨ Manuskript korrigieren"
if uploaded_file.name.endswith('.pdf'):
process_button_name = "✨ Umbruch prüfen"
def set_in_progress():
st.session_state.in_progress = True
# API request button
if st.button(process_button_name, on_click=set_in_progress, disabled=not password_is_correct(password) or st.session_state.in_progress):
with st.spinner('Datei wird verarbeitet …'):
if uploaded_file.name.endswith('.docx'):
process_docx(uploaded_file)
elif uploaded_file.name.endswith('.pdf'):
process_pdf(uploaded_file)
else:
st.warning('Bitte laden Sie eine Datei des Typs .docx oder .pdf hoch.')
st.session_state.in_progress = False
if not password_is_correct(password):
st.error('**Zugriffscode ist falsch.** Wenn Sie Bookshine testen wollen, aber keinen Zugriffscode haben, schreiben Sie einfach eine formlose E-Mail an alexander.seifert@gmail.com mit dem Betreff `Bookshine Zugriffscode`.')
if __name__ == '__main__':
main()