File size: 2,630 Bytes
73c784b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
import requests
import shutil
import gradio as gr
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor
from zipfile import ZipFile

def get_image_ids(batch_id: str) -> list[str]:
    """A list of image IDs in the given batch"""
    response = requests.get(f"https://iiifintern.ra.se/arkis!{batch_id}/manifest")
    response.raise_for_status()
    response = response.json()
    return [item["id"].split("!")[1][:14] for item in response["items"]]

def download_image(url: str, dest: str) -> None:
    """
    Download an image

    Arguments:
        url: Image url
        dest: Destination file name
    """
    response = requests.get(url, stream=True)
    with open(dest, "wb") as out_file:
        shutil.copyfileobj(response.raw, out_file)
    del response

def download_image_by_image_id(image_id: str, progress=None):
    """
    Download the image with the given image ID

    Creates a directory named after the batch ID and saves the image in
    that directory.
    """
    batch_id = image_id[:8]
    os.makedirs(batch_id, exist_ok=True)
    url = f"https://lbiiif.riksarkivet.se/arkis!{image_id}/full/max/0/default.jpg"
    dest = os.path.join(batch_id, image_id + ".jpg")
    download_image(url, dest)
    if progress:
        progress.update(1)

def download_batch_images(batch_id: str, workers: int = 2):
    image_ids = get_image_ids(batch_id)
    total_images = len(image_ids)

    progress = tqdm(total=total_images, desc=f"Downloading {batch_id}", leave=False)
    
    with ThreadPoolExecutor(max_workers=workers) as executor:
        for image_id in image_ids:
            executor.submit(download_image_by_image_id, image_id, progress)

    progress.close()

    # Zip the folder with downloaded images
    zip_filename = f"{batch_id}.zip"
    with ZipFile(zip_filename, 'w') as zipf:
        for image_id in image_ids:
            img_path = os.path.join(batch_id, f"{image_id}.jpg")
            zipf.write(img_path, arcname=os.path.basename(img_path))

    return zip_filename

def gradio_interface(batch_id):
    try:
        zip_file = download_batch_images(batch_id)
        return zip_file  # Return the zip file path for download
    except Exception as e:
        return str(e)

with gr.Blocks() as app:
    gr.Markdown("# Batch Image Downloader")

    with gr.Row():
        batch_id_input = gr.Textbox(label="Batch ID")
    
    output_file = gr.File(label="Download Zip File")

    download_button = gr.Button("Download Images")

    download_button.click(
        gradio_interface,
        inputs=[batch_id_input],
        outputs=[output_file]
    )

app.launch()