File size: 4,102 Bytes
5f86e17
 
aa692d6
 
5f86e17
aa692d6
 
d978a28
 
5f86e17
aa692d6
5f86e17
 
d978a28
5f86e17
 
 
 
d978a28
 
 
 
 
 
 
aa692d6
5f86e17
d978a28
da595b2
d978a28
 
 
 
 
25ff2a0
d978a28
25ff2a0
5f86e17
aa692d6
d978a28
 
aa692d6
 
 
d978a28
 
a2cee50
d978a28
24a7147
ec1948b
 
 
 
 
 
5f86e17
 
 
 
 
 
d978a28
 
 
 
 
5f86e17
 
 
 
 
d978a28
 
 
990e374
5f86e17
 
 
 
 
 
 
aa692d6
5f86e17
 
d978a28
25ff2a0
5f86e17
 
 
 
 
 
aa692d6
 
5f86e17
 
5721afe
5f86e17
 
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
92
93
94
95
96
97
98
99
100
101
import gradio as gr
import requests
import subprocess
import os
from huggingface_hub import whoami
from huggingface_hub import HfApi
from huggingface_hub import login
import random
import time

api=HfApi()
REPO_TYPES = ["model", "dataset", "space"]

def duplicate(source_url, dst_repo, token, new_name, dst_repo_path, repo_type):
    try:
        _ = whoami(token)
        # ^ this will throw if token is invalid

        # make sure the user fills out the other required paths.
        if not dst_repo_path[len(dst_repo_path)-1] == '/':
                raise Exception("Your destination path *must* end with a /")
        if not source_url:
                raise Exception("You haven't chosen a file to download!")
        if not dst_repo:
                raise Exception("You haven't chosen a repo to download to")
        login(token=token)

        # keep things separate, partly in case people download different files with same name (`download.zip`). Especially, it also allows saving filename to work
        dir="/home/user/apps/downloads/"+str(int(time.time()))+str(random.getrandbits(8))+"/"
        subprocess.check_call([r"mkdir","-p",dir])
        subprocess.check_call([r"aria2c","-x16","--split=16",source_url,"--dir="+dir])
        files=os.listdir(dir)

        if new_name:
                dst_repo_path=dst_repo_path.strip("/")+"/"+new_name.strip("/")
        else:
                dst_repo_path=dst_repo_path.strip("/")+"/"+files[0]

        api.upload_file(
                path_or_fileobj=dir+files[0],
                path_in_repo=dst_repo_path,
                repo_id=dst_repo,
                repo_type=repo_type
        )

        # now clean up
        os.remove(dir+files[0])
        os.rmdir(dir)
        match repo_type:
                case "space":
                        repo_url=f"https://hf.co/spaces/{dst_repo}"
                case "dataset":
                        repo_url=f"https://hf.co/datasets/{dst_repo}"
                case "model":
                        repo_url=f"https://hf.co/{dst_repo}"
        return (
            f'Find your repo <a href=\'{repo_url}\' target="_blank" style="text-decoration:underline">here</a>',
            "sp.jpg",
        )

    except Exception as e:
        blames=["grandma","my boss","your boss","God","you","you. It's *all* your fault.","the pope"]
        blameweights=(1,1,1,1,4,2,1)
        excuses=["I blame it all on "+random.choices(blames,weights=blameweights)[0],"It's my fault, sorry.","I did it on purpose.","That file doesn't want to be downloaded.","You nincompoop!"]
        excusesweights=(12,1,1,2,3)
        excuse=random.choices(excuses,weights=excusesweights)[0]
        return (
            f"""
        ### Error 😢😢😢
        
        {e}
        
        
        
        <i>""" + excuse+"</i>",
            None,
        )


interface = gr.Interface(
    fn=duplicate,
    inputs=[
        gr.Textbox(placeholder="Source URL (e.g. civitai.com/api/download/models/4324322534)"),
        gr.Textbox(placeholder="Destination repository (e.g. osanseviero/dst)"),
        gr.Textbox(placeholder="Write access token", type="password"),
        gr.Textbox(placeholder="Post-download name of your file, if you want it changed (e.g. stupidmodel.safetensors)"),
        gr.Textbox(placeholder="Destination for your file within your repo. Don't include the filename (e.g. /models/Stable-diffusion/)"),
        gr.Dropdown(choices=REPO_TYPES, value="model"),
    ],
    outputs=[
        gr.Markdown(label="output"),
        gr.Image(show_label=False),
    ],
    title="Download a file to your repo!",
    description="Download a file to your Hugging Face repository! You need to specify a write token obtained in https://hf.co/settings/tokens. This Space is a an experimental demo.",
    article="<p>Find your write token at <a href='https://huggingface.co/settings/tokens' target='_blank'>token settings</a></p>",
    allow_flagging="never",
    live=False, # since i keep wondering, this prevents it from running again automatically when an input changes
)
interface.launch(enable_queue=True)