Squeeze Effect

Description

This API generates a squeeze-effect video in the cloud.

Version

1.0

Image Requirements

Image formats: JPG and PNG.

Request URL

    Production environment: https://openapi.meitu.com
    Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
    Task name (task): /v1/squeeze_video/squeeze/364664
    Task type (task_type): formula

Request Method

POST

Content-Type: application/json

Authentication

Open Platform API Signing

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters as a JSON string. The source document does not define algorithm parameters for this API.
Yesinit_imagesobject[]List of image files.
YestaskstringFixed value: /v1/squeeze_video/squeeze/364664.
Yestask_typestringFixed value: formula.
Nosync_timeoutintSynchronous timeout. Default: 30.

The structure of each image object in init_images is described below.

RequiredParameterTypeDescription
YesurlstringImage URL or base64 data.
YesprofileobjectImage attribute information.

profile attribute information

RequiredParameterTypeDescription
Yesmedia_profilesobjectImage media attributes.

The source document does not define profile.version; therefore, this field is not added here.

media_profiles media attributes

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates that the url field contains an image URL. jpg indicates that the url field contains a base64-encoded JPG image. Default: url.

The params inference parameters are passed as a JSON string with the following structure.

RequiredFieldTypeDescription
YesparameterobjectCore algorithm parameter object. The source document does not define any algorithm parameter fields for this API, so the example passes an empty object.

Request Example

{
  "task": "/v1/squeeze_video/squeeze/364664",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg",
      "profile": {
        "media_profiles": {
          "media_data_type": "url"
        }
      }
    }
  ],
  "params": "{\"parameter\":{}}",
  "sync_timeout": 30
}

Response Description

Note: Generated results are cleaned up periodically. Download and save them promptly. The source document states that result images are periodically cleaned up after 24 hours.
FieldTypeDescription
request_idstringRequest identifier.
trace_idstringTrace identifier.
codeintBusiness status code. 0 means the request was accepted successfully.
error_codeintError code. 0 on success.
messagestringBusiness information or error message.
tipsanyAdditional information; may be null.
dataobjectTask status and algorithm result.

data fields

FieldTypeDescription
statusintStatus code: -1 means the task was not found; 0 means the task was created; 1 means processing; 2 means failed; 9 means that the query endpoint must be used; 10 means succeeded.
msgstringMedia-file attribute information.
resultobjectAlgorithm result.
progressnumberTask progress, for example 0.1, 0.85, or 1.
predict_elapsedintEstimated processing time in milliseconds.
create_timeint64Creation timestamp in milliseconds.
task_idstringTask ID.
custom_task_idstringClient-defined task ID.
trace_idstringTrace identifier.
client_infostringClient information.
init_imagesobject[]/nullEcho of the input media.

result fields

FieldTypeDescription
idstringTask ID.
urlsstring[]List of result URLs.

Response Examples

Successful Response Example

Response Status: 200

content-type: application/json; charset=utf-8

{
  "code": 0,
  "message": "",
  "data": {
    "status": 10,
    "result": {
      "id": "50309bd5-a827-4125-bc96-62039c93770b",
      "urls": [
        "https://obs.mtlab.meitu.com/mtopen/rF5GIhp5ReLKgLV91CKj5BO1q2FTLMmc/MTY5Mjg1MzIwMA==/1c39ef92-04f1-40b4-5b7e-8fcfca0c11ea.png"
      ]
    },
    "progress": 1
  }
}

Query-Required Response Example

When data.status is 9, use the query endpoint with the returned result.id to retrieve the task result.

Response Status: 200

content-type: application/json; charset=utf-8

{
  "code": 0,
  "message": "",
  "data": {
    "status": 9,
    "result": {
      "id": "task_1234567890"
    },
    "progress": 0
  }
}

The query-required example above only illustrates the status=9 behavior defined by the source document; the task ID is illustrative.

Failed Response Example

Response Status: 400

content-type: application/json; charset=utf-8

{
  "request_id": "req_1234567890",
  "trace_id": "trace_1234567890",
  "code": 20008,
  "error_code": 20008,
  "message": "UNSUITABLE_IMAGE",
  "tips": null,
  "data": {
    "status": 2,
    "result": {
      "ErrorCode": 20008,
      "ErrorMsg": "UNSUITABLE_IMAGE",
      "Data": null
    },
    "progress": 0,
    "predict_elapsed": 0,
    "create_time": 1718172000000,
    "task_id": "",
    "custom_task_id": "",
    "trace_id": "trace_1234567890",
    "client_info": "",
    "init_images": null
  }
}

The original failed-request example reports 20008 UNSUITABLE_IMAGE. The API-specific error 20001 PROCESS_ERROR in the table below is a different error and must not be conflated with it.

API-Specific Error Codes and Messages

ErrorCodeError MessageDescription
20001PROCESS_ERRORProcessing error.

Common Error Codes and Messages

See API Error Codes.

SDK Examples

Python

import json

import requests
from sign_sdk import sign

def api_call_example():
    key = "your_api_key"
    secret = "your_api_secret"
    url = "https://openapi.meitu.com/api/v1/sdk/sync/push"
    method = "POST"

    headers = {
        "Content-Type": "application/json",
        sign.HeaderHost: "openapi.meitu.com",
    }
    inner_params = {"parameter": {}}
    payload = {
        "task": "/v1/squeeze_video/squeeze/364664",
        "task_type": "formula",
        "init_images": [
            {
                "url": "https://example.com/input.jpg",
                "profile": {
                    "media_profiles": {"media_data_type": "url"},
                },
            }
        ],
        "params": json.dumps(inner_params, ensure_ascii=False),
        "sync_timeout": 30,
    }
    body = json.dumps(payload, ensure_ascii=False)

    signer = sign.Signer(key, secret)
    signed_request = signer.sign(url, method, headers, body)
    response = requests.Session().send(signed_request)
    print(f"Status: {response.status_code}")
    print(f"Response: {response.text}")

if __name__ == "__main__":
    api_call_example()

Go

package main

import (
	"fmt"
	"io"
	"net/http"

	"github.com/mtlab/api/signer"
)

func main() {
	key := "your_api_key"
	secret := "your_api_secret"
	signObj := signer.NewSigner(key, secret)

	url := "https://openapi.meitu.com/api/v1/sdk/sync/push"
	method := http.MethodPost
	headers := make(http.Header)
	headers.Set(signer.HeaderHost, "openapi.meitu.com")
	headers.Set("Content-Type", "application/json")

	body := `{
  "task": "/v1/squeeze_video/squeeze/364664",
  "task_type": "formula",
  "init_images": [{
    "url": "https://example.com/input.jpg",
    "profile": {
      "media_profiles": {"media_data_type": "url"}
    }
  }],
  "params": "{\"parameter\":{}}",
  "sync_timeout": 30
}`

	req, err := signObj.Sign(url, method, headers, body)
	if err != nil {
		fmt.Println("Failed to sign request:", err)
		return
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Println("Failed to send request:", err)
		return
	}
	defer resp.Body.Close()

	responseBody, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Read response failed:", err)
		return
	}
	fmt.Println("Response:", resp.StatusCode, string(responseBody))
}

PHP

<?php
require 'signer.php';

$key = 'your_api_key';
$secret = 'your_api_secret';
$signer = new Signer($key, $secret);

$url = 'https://openapi.meitu.com/api/v1/sdk/sync/push';
$method = 'POST';
$headers = ['Content-Type' => 'application/json'];

$innerParams = json_encode([
    'parameter' => (object) [],
]);

$body = json_encode([
    'task' => '/v1/squeeze_video/squeeze/364664',
    'task_type' => 'formula',
    'init_images' => [
        [
            'url' => 'https://example.com/input.jpg',
            'profile' => [
                'media_profiles' => ['media_data_type' => 'url'],
            ],
        ],
    ],
    'params' => $innerParams,
    'sync_timeout' => 30,
]);

$curl = $signer->sign($url, $method, $headers, $body);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ($status === 0) {
    echo 'Error: ' . curl_error($curl);
} else {
    echo "Status: {$status}\n";
    echo "Response: {$response}\n";
}
curl_close($curl);
?>

Java

package com.meitu.openai.common;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws Exception {
        Signer signer = new Signer("your_api_key", "your_api_secret");
        String url = "https://openapi.meitu.com/api/v1/sdk/sync/push";
        String method = "POST";

        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        headers.put(Signer.HeaderHost, "openapi.meitu.com");

        String body = "{\n" +
                "  \"task\": \"/v1/squeeze_video/squeeze/364664\",\n" +
                "  \"task_type\": \"formula\",\n" +
                "  \"init_images\": [{\n" +
                "    \"url\": \"https://example.com/input.jpg\",\n" +
                "    \"profile\": {\n" +
                "      \"media_profiles\": {\"media_data_type\": \"url\"}\n" +
                "    }\n" +
                "  }],\n" +
                "  \"params\": \"{\\\"parameter\\\":{}}\",\n" +
                "  \"sync_timeout\": 30\n" +
                "}";

        Map<String, String> signedHeaders = signer.sign(url, method, headers, body);
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod(method);
        for (Map.Entry<String, String> entry : signedHeaders.entrySet()) {
            connection.setRequestProperty(entry.getKey(), entry.getValue());
        }
        connection.setDoOutput(true);
        connection.getOutputStream().write(body.getBytes(StandardCharsets.UTF_8));

        int status = connection.getResponseCode();
        InputStream stream = status >= 400
                ? connection.getErrorStream()
                : connection.getInputStream();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            System.out.println("Response: " + status + " " + response);
        }
    }
}