File size: 5,585 Bytes
2cd432c
 
 
 
 
 
a78ed31
2cd432c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a78ed31
2cd432c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b4878c
2cd432c
 
a78ed31
2cd432c
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import time
import os
import requests
import gradio as gr
import simplejson as json
import oss2

CSS = '.gradio-container a {color:#b7adf4 !important}'
HEADERS = {'app-key': os.environ['a3'], 'origin': os.environ['a4'], 'referer': os.environ['a4']}


def login(loginId, password):
    data = {'loginId': loginId, 'password': password}
    cookies = {'720yun_v8_session': os.environ['a3']}

    resp = requests.post(os.environ['a5'], data=data, headers=HEADERS, cookies=cookies)

    if resp.status_code == 200:
        return resp.json()['data']['token']
    raise gr.Error('Error')


def create_panorama(prompt, negative_prompt):
    data = {'api_key': os.environ['a2'], 'generator': 'stable-skybox-trt', 'prompt': prompt, 'negative_text': negative_prompt}
    resp = requests.post(os.environ['a1'], data=data)

    if resp.status_code == 200:
        request_id = resp.json()['request']['id']
        flag = True
        while flag:
            resp = requests.get(f'{os.environ["a1"]}/{request_id}?api_key={os.environ["a2"]}')
            if resp.status_code == 200:
                progress_data = resp.json()['request']
                if progress_data['progress'] == 100 and progress_data['status'] == 'complete':
                    flag = False
                    return request_id, progress_data['file_url']
            time.sleep(1)


def upload(token, file_id, file_url):
    now = int(time.time())
    data = [{
        'fileId': f'{file_id}-{now}',
        'name': f'AI素材-{now}',
        'watermarked': 0,
        'size': 1024 * 1024 * 6,
        'albumId': 0,
        'exif': {},
        'gps': {},
        'panoId': 0,
        'action': 1
    }]
    HEADERS['app-authorization'] = token
    resp = requests.post(os.environ['a6'], data={'panos': json.dumps(data)}, headers=HEADERS)
    if resp.status_code == 200:
        resp_data = resp.json()['data'][0]
        access_key_id = resp_data['accessKeyId']
        security_token = resp_data['securityToken']
        accessKey_secret = resp_data['accessKeySecret']
        bucket_name = resp_data['bucketName']
        path = resp_data['path'][1:]
        endpoint = resp_data['endpointO']
        pano_id = resp_data['panoId']
        task_id = resp_data['taskId']
        expired = resp_data['expired']

        auth = oss2.StsAuth(access_key_id, accessKey_secret, security_token)
        bucket = oss2.Bucket(auth, endpoint, bucket_name)

        input_stream = requests.get(file_url)
        result = bucket.put_object(f'{path}/{pano_id}.jpg', input_stream)
        if result.status == 200:
            resp = requests.post(f'{os.environ["a6"]}/{task_id}', data={'status': 3, 'expired': expired}, headers=HEADERS)
            time.sleep(5)
            if resp.status_code == 200:
                flag = True
                while flag:
                    pano_ids = [pano['id'] for pano in requests.get(os.environ["a7"], headers=HEADERS).json()['data']]
                    if pano_id not in pano_ids:
                        flag = False
                        break
                    time.sleep(1)
                data = {
                    'name': f'AI全景作品-{now}',
                    'materials': json.dumps([{
                        'type': 1,
                        'id': pano_id
                    }]),
                    'templateId': 2,
                    'publishPlatform': 1,
                    'keywords': 'AI全景',
                    'source': 99
                }
                resp = requests.post(os.environ['a8'], data=data, headers=HEADERS)
                if resp.status_code == 200:
                    return resp.json()['data']['tid']


def main(loginId, password, prompt, negative_prompt, state, progress=gr.Progress()):
    if 'token' not in state:
        state['token'] = login(loginId, password)
    token = state['token']

    file_id, image = create_panorama(prompt, negative_prompt)
    panorama_id = upload(token, file_id, image)
    return f'https://www.720yun.com/vr/{panorama_id}'


with gr.Blocks(css=CSS) as demo:
    session = gr.State({})

    gr.Markdown("""
        # Generate your own panorama with AI
        Your **[720yun.com](https://www.720yun.com)** account is required.
        Support by **[720yun.com](https://www.720yun.com)**.
        Prompt example: a beautiful matte painting of northernmost continent, a gigantic square fortress covered by blizzard, texture smooth, aerial view, epic composition, post apocalyptic, sharp focus, sci-fi, futuristic, fantasy, clean background trending, by Jan Urschel and Sergey Vasnev and Emmanuel Shiu and Liam Wong and Michal Karcz, ornate, cinematic, cinematic lighting, light effect, epic, airy vibrant theme, octane render, unreal engine, concise and clear, 4k hd wallpaper, trending on artstation and cgsociety
    """)
    with gr.Row():
        with gr.Column():
            login_id = gr.Textbox(label='LoginId', placeholder='720yun loginId')
        with gr.Column():
            password = gr.Textbox(label='Password', type='password', placeholder='720yun password')
    with gr.Row():
        prompt = gr.Textbox(label='Prompt', lines=5, placeholder='Enter your prompt')
    with gr.Row():
        negative_prompt = gr.Textbox(label='Negative prompt', lines=2, placeholder='Enter your negative prompt')
    with gr.Row():
        out = gr.Textbox(label='Panorama Url')

    btn = gr.Button('Run')
    btn.click(fn=main, inputs=[login_id, password, prompt, negative_prompt, session], outputs=out, show_progress=True)

demo.queue().launch()