import argparse import streamlit as st from zipfile import ZipFile from attach_images_to_notebook import attach_images_back_to_notebook from extract_and_save_images import extract_and_save_images import shutil import os def main(): parser = argparse.ArgumentParser(description='Extract and update images in Jupyter Notebook or revert images back to attachments.') subparsers = parser.add_subparsers(dest='command') extract_parser = subparsers.add_parser('extract', help='Extract images and update notebook') extract_parser.add_argument('notebook_path', help='Path to the Jupyter Notebook file.') extract_parser.add_argument('output_dir', help='Directory to save extracted images.') extract_parser.add_argument('is_unix', action='store_true', help='Flag to indicate if the platform is Linux.') revert_parser = subparsers.add_parser('revert', help='Update images back to attachments') revert_parser.add_argument('notebook_path', help='Path to the updated Jupyter Notebook file.') args = parser.parse_args() if args.command == 'extract': extract_and_save_images(args.notebook_path, args.output_dir, args.is_linux) elif args.command == 'revert': attach_images_back_to_notebook(args.notebook_path) else: parser.print_help() if __name__ == "__main__": main() main_upload_folder = 'uploads' os.makedirs(main_upload_folder, exist_ok=True) # Streamlit UI st.title('Jupyter Notebook Image Tool') command = st.sidebar.selectbox('Select Command', ['extract', 'revert']) if command == 'extract': st.text('Extract images attached in a Jupyter Notebook and update the notebook with image paths.') notebook = st.file_uploader('Upload Jupyter Notebook', type=['ipynb']) output_dir = st.text_input('Enter Images Directory Name:', value='notebook_images') is_linux = st.checkbox('Is Linux?', help='Check this if you are running on a Linux platform to use the correct path separator.') # Show text st.text('For faster unzip, run the following code in a cell in the Jupyter Notebook:') st.code(f''' import os import zipfile with zipfile.ZipFile('{output_dir}.zip', 'r') as zip_ref: zip_ref.extractall() os.remove('{output_dir}.zip') ''') if st.button('Extract Images and Update Notebook'): if notebook is not None: notebook_path = os.path.join(main_upload_folder, notebook.name) with open(notebook_path, 'wb') as f: f.write(notebook.getvalue()) if os.path.exists('outputs'): shutil.rmtree('outputs') extract_and_save_images(notebook_path, output_dir, is_linux=is_linux) elif command == 'revert': st.text('Attach images back to a Jupyter Notebook from a folder of images.') notebook = st.file_uploader('Upload Notebook', type=['ipynb']) images_folder = st.file_uploader('Upload Images Folder as Zip', type=['zip']) if st.button('Attach Images Back to Notebook'): if notebook is not None and images_folder is not None: notebook_path = os.path.join(main_upload_folder, notebook.name) # Extracting notebook with open(notebook_path, 'wb') as f: f.write(notebook.getvalue()) # Extracting images with ZipFile(images_folder) as z: z.extractall(path='uploads') if os.path.exists('outputs'): shutil.rmtree('outputs') attach_images_back_to_notebook(notebook_path) # Removing uploads folder shutil.rmtree('uploads')