MeideDe - Video Color Enhancement

Description

This API submits a video color enhancement task. The algorithm starts processing after the task is successfully submitted. The result is returned synchronously when available. If the task times out or is still processing, use the query API to retrieve the result.

Version

1.0

Media Requirements

  • Supported format: MP4
  • File size: No more than 30 MB
  • Only video URL requests are currently supported

API URL

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

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]Media file list
YestaskstringFixed value: /v1/videoenhance/491343
Yestask_typestringFixed value: formula
Nosync_timeoutintSynchronous timeout in seconds. Default: 30

The structure of each media file in init_images is as follows:

RequiredParameterTypeDescription
YesurlstringVideo URL. This API currently supports URL requests only
YesprofileobjectAttribute information

The structure of profile is as follows:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia attribute information
YesversionstringFixed value: v1

The structure of media_profiles is as follows:

RequiredParameterTypeDescription
Yesmedia_data_typestringFixed value: url, indicating a video URL
Nomirro_infoint1 means mirrored; 0 means not mirrored. Default: 0
Noorientation_tagintA value from 1 to 8, representing the eight EXIF orientation tag directions. Default: 1
Noreturn_videoint0 returns a ZIP matrix package; 1 returns a video. Default: 0

The params inference parameter is a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefault: url; jpg indicates base64
YesparameterobjectCore algorithm parameter object

Details of the algorithm parameters in parameter:

RequiredParameterTypeDescription
Norepost_urlstringPOST callback URL provided by the client
Norsp_media_typestringMP4: Returns the result video directly as base64-encoded data

Request Examples

Return a ZIP Matrix Package

{
  "task": "/v1/videoenhance/491343",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://example.com/input.mp4",
      "profile": {
        "media_profiles": {
          "media_data_type": "url",
          "mirro_info": 0,
          "return_video": 0
        },
        "version": "v1"
      }
    }
  ],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"repost_url\":\"http://example.com/callback\"}}",
  "sync_timeout": 30
}

Return an MP4 Video

{
  "task": "/v1/videoenhance/491343",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://example.com/input.mp4",
      "profile": {
        "media_profiles": {
          "media_data_type": "url",
          "mirro_info": 0,
          "orientation_tag": 1,
          "return_video": 1
        },
        "version": "v1"
      }
    }
  ],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"rsp_media_type\":\"MP4\"}}",
  "sync_timeout": 30
}

Response Fields

Note: Generated results are periodically removed. Download and save them promptly.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code. 0 indicates that the request was accepted successfully
error_codeintError code. 0 on success
messagestringBusiness message
tipsanyAdditional information; may be null
dataobjectTask status and algorithm result

Fields in data:

FieldTypeDescription
statusint-1: task not found; 0: created; 1: processing; 2: failed; 9: timed out—use the query API; 10: succeeded
resultobjectAlgorithm result
progressnumberTask progress
predict_elapsedintEstimated processing time in milliseconds
create_timeint64Creation timestamp in milliseconds
task_idstringTask ID
custom_task_idstringClient-defined task ID
trace_idstringTrace identifier within data
client_infostringClient information
init_imagesobject[]/nullEchoed input media

Fields in result:

FieldTypeDescription
idstringTask result ID
urlsarrayResult file URL list
imagesarrayResult file URL list
media_info_listarrayResult media information list
msg_idstringUnique request identifier generated by the algorithm service
msgstringResult status message
codeintAlgorithm error code
dataobjectDetailed result returned by the algorithm service

Fields in each element of media_info_list:

FieldTypeDescription
media_datastringResult file URL
media_profilesobjectMedia attribute information
media_extraobjectExtended media information

Fields in media_profiles:

FieldTypeDescription
media_data_typestringMedia type
media_data_widthintMedia width
media_data_heightintMedia height
media_data_sizeintMedia file size

Fields in data.result.data on failure:

FieldTypeDescription
durationobjectProcessing time information for each algorithm task stage
error_codeintAlgorithm error code
error_msgstringAlgorithm error message
extraobjectExtended algorithm information
media_info_listarrayResult media information list
msg_idstringUnique request identifier generated by the algorithm service
parameterobject/nullEchoed algorithm parameters

Fields in duration:

FieldTypeDescription
alg_process_timeintAlgorithm processing time
created_timestampintTask creation timestamp
pull_timestampintTask retrieval timestamp
repost_timeintCallback time
upload_timeintUpload time
waiting_timeintWaiting time

Response Examples

Successful Response Example

Response Status: 200

Content-Type: application/json; charset=utf-8

{
  "request_id": "",
  "trace_id": "",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 10,
    "result": {
      "id": "t_mt1a3i5n7b12345678-1234-4abc-9def-123456789abc",
      "urls": [
        "https://example.com/result/videoenhance_result.mp4"
      ],
      "images": [
        "https://example.com/result/videoenhance_result.mp4"
      ],
      "media_info_list": [
        {
          "media_data": "https://example.com/result/videoenhance_result.mp4",
          "media_profiles": {
            "media_data_type": "MP4",
            "media_data_width": 720,
            "media_data_height": 1280,
            "media_data_size": 10485760
          },
          "media_extra": {}
        }
      ],
      "msg_id": "3911018f-faa7-4813-919c-dddddd5fcbac",
      "msg": "success",
      "data": {}
    },
    "progress": 1,
    "predict_elapsed": 10000,
    "create_time": 1759202368761,
    "task_id": "t_mt1a3i5n7b12345678-1234-4abc-9def-123456789abc",
    "custom_task_id": "",
    "trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
    "client_info": "",
    "init_images": null
  }
}

Query-Required Response Example

Use the query API to retrieve the result.

Response Status: 200

Content-Type: application/json; charset=utf-8

{
  "request_id": "",
  "trace_id": "",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 9,
    "result": {
      "id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e"
    },
    "progress": 0,
    "predict_elapsed": 10000,
    "create_time": 1759202368761,
    "task_id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e",
    "custom_task_id": "",
    "trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
    "client_info": "",
    "init_images": null
  }
}

Failed Response Example

Response Status: 400

Content-Type: application/json; charset=utf-8

{
  "request_id": "",
  "trace_id": "",
  "code": 20001,
  "error_code": 20001,
  "message": "ALGO_MODEL_CRASH",
  "tips": null,
  "data": {
    "status": 2,
    "result": {
      "id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
      "code": 20001,
      "data": {
        "duration": {
          "alg_process_time": 0,
          "created_timestamp": 1759201989,
          "pull_timestamp": 1759201989,
          "repost_time": 0,
          "upload_time": 0,
          "waiting_time": 0
        },
        "error_code": 20001,
        "error_msg": "ALGO_MODEL_CRASH",
        "extra": {},
        "media_info_list": [],
        "msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec",
        "parameter": null
      },
      "msg": "ALGO_MODEL_CRASH",
      "msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec"
    },
    "progress": 1,
    "predict_elapsed": 10000,
    "create_time": 1759201989444,
    "task_id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
    "custom_task_id": "",
    "trace_id": "",
    "client_info": "",
    "init_images": null
  }
}

General Error Codes

This API currently has no API-specific error codes. See API Error Codes for details.

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 = {
        "rsp_media_type": "url",
        "parameter": {"rsp_media_type": "MP4"},
    }
    payload = {
        "task": "/v1/videoenhance/491343",
        "task_type": "formula",
        "init_images": [
            {
                "url": "https://example.com/input.mp4",
                "profile": {
                    "media_profiles": {
                        "media_data_type": "url",
                        "mirro_info": 0,
                        "orientation_tag": 1,
                        "return_video": 1,
                    },
                    "version": "v1",
                },
            }
        ],
        "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/videoenhance/491343",
  "task_type": "formula",
  "init_images": [{
    "url": "https://example.com/input.mp4",
    "profile": {
      "media_profiles": {
        "media_data_type": "url",
        "mirro_info": 0,
        "orientation_tag": 1,
        "return_video": 1
      },
      "version": "v1"
    }
  }],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"rsp_media_type\":\"MP4\"}}",
  "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([
    'rsp_media_type' => 'url',
    'parameter' => ['rsp_media_type' => 'MP4'],
]);

$body = json_encode([
    'task' => '/v1/videoenhance/491343',
    'task_type' => 'formula',
    'init_images' => [
        [
            'url' => 'https://example.com/input.mp4',
            'profile' => [
                'media_profiles' => [
                    'media_data_type' => 'url',
                    'mirro_info' => 0,
                    'orientation_tag' => 1,
                    'return_video' => 1,
                ],
                'version' => 'v1',
            ],
        ],
    ],
    '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/videoenhance/491343\",\n" +
                "  \"task_type\": \"formula\",\n" +
                "  \"init_images\": [{\n" +
                "    \"url\": \"https://example.com/input.mp4\",\n" +
                "    \"profile\": {\n" +
                "      \"media_profiles\": {\n" +
                "        \"media_data_type\": \"url\",\n" +
                "        \"mirro_info\": 0,\n" +
                "        \"orientation_tag\": 1,\n" +
                "        \"return_video\": 1\n" +
                "      },\n" +
                "      \"version\": \"v1\"\n" +
                "    }\n" +
                "  }],\n" +
                "  \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"rsp_media_type\\\":\\\"MP4\\\"}}\",\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);
        }
    }
}