File size: 3,046 Bytes
1d123d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
90
91
import os
import gradio as gr
from huggingface_hub import get_collection
import re

def extract_collection_id(input_text):
    # Check if input is a full URL
    url_match = re.match(r'https://huggingface\.co/collections/(.+)$', input_text)
    if url_match:
        return url_match.group(1)
    
    # Check if input is already in the correct format
    if re.match(r'^[\w-]+/[\w-]+$', input_text):
        return input_text
    
    return None

def load_collection():
    collection_input = os.getenv('COLLECTION_SLUG_OR_URL')
    if not collection_input:
        raise ValueError("COLLECTION_SLUG_OR_URL environment variable is not set.")
    
    collection_id = extract_collection_id(collection_input)
    if not collection_id:
        raise ValueError("Invalid collection ID or URL in COLLECTION_SLUG_OR_URL environment variable.")
    
    collection = get_collection(collection_id)
    dataset_ids = [item.item_id for item in collection.items if item.item_type == 'dataset']
    if not dataset_ids:
        raise ValueError("No datasets found in this collection.")
    
    return dataset_ids, collection_id

def display_dataset(dataset_ids, index):
    dataset_id = dataset_ids[index]
    return gr.HTML(f"""<iframe
    src="https://huggingface.co/datasets/{dataset_id}/embed/viewer"
    frameborder="0"
    width="100%"
    height="560px"
></iframe>""")

def navigate_dataset(dataset_ids, index, direction):
    new_index = (index + direction) % len(dataset_ids)
    return new_index, f"Dataset {new_index + 1} of {len(dataset_ids)}: {dataset_ids[new_index]}"

try:
    dataset_ids, collection_id = load_collection()
    
    with gr.Blocks() as demo:
        gr.Markdown(f"<h1>Dataset Viewer for Collection: {collection_id}</h1>")
        
        index_state = gr.State(value=0)
        
        with gr.Row():
            left_btn = gr.Button("Previous")
            right_btn = gr.Button("Next")
        
        dataset_info = gr.Markdown(f"Dataset 1 of {len(dataset_ids)}: {dataset_ids[0]}")
        iframe_output = gr.HTML()
        
        left_btn.click(
            navigate_dataset,
            inputs=[gr.State(dataset_ids), index_state, gr.Number(-1, visible=False)],
            outputs=[index_state, dataset_info]
        )
        right_btn.click(
            navigate_dataset,
            inputs=[gr.State(dataset_ids), index_state, gr.Number(1, visible=False)],
            outputs=[index_state, dataset_info]
        )
        
        index_state.change(
            display_dataset,
            inputs=[gr.State(dataset_ids), index_state],
            outputs=[iframe_output]
        )
        
        # Initialize the display with the first dataset
        demo.load(
            fn=lambda: display_dataset(dataset_ids, 0),
            inputs=None,
            outputs=[iframe_output],
        )

    if __name__ == "__main__":
        demo.launch()

except Exception as e:
    print(f"Error: {str(e)}")
    print("Please set the COLLECTION_SLUG_OR_URL environment variable with a valid collection ID or URL.")