# Media

Post mengacu ke media lewat id. Ada tiga cara menambahkan file.

## Impor dari URL

Paling cocok untuk file yang sudah online (CDN Anda, toko online, link Drive yang langsung mengunduh):

```sh
curl https://postflow.biz.id/api/v1/media \
  -H "Authorization: Bearer $POSTFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://cdn.example.com/reel.mp4", "width": 1080, "height": 1920, "durationMs": 21000 }'
```

- URL harus `https://` publik; alamat privat dan lokal ditolak.
- Server harus menjawab dalam 60 detik, dan mengirim `Content-Length` untuk video.
- Jenis file diambil dari `Content-Type` respons.

## Upload file

Kirim byte file sebagai body request, sampai 30 MB untuk gambar dan 1 GB untuk video:

```sh
curl "https://postflow.biz.id/api/v1/media/upload?name=menu.jpg" \
  -H "Authorization: Bearer $POSTFLOW_API_KEY" \
  -H "Content-Type: image/jpeg" \
  --data-binary @menu.jpg
```

Untuk video tambahkan `width`, `height` dan `durationMs` di query, sama seperti impor.

## Upload multipart (besar atau bisa dilanjutkan)

1. [`POST /media/uploads`](/api/operations/startmediaupload/) dengan `{ name, mime, size, width?, height?, durationMs? }`. Anda mendapat
   `mediaId`, `uploadId`, `partSize` (10 MB) dan `partCount`.
2. Untuk tiap part `n` mulai dari 1: [`PUT /media/uploads/{mediaId}/parts/{n}?uploadId=…`](/api/operations/uploadmediapart/) dengan
   byte part tersebut. Simpan setiap `etag`.
3. [`POST /media/uploads/{mediaId}/complete`](/api/operations/completemediaupload/) dengan `{ uploadId, parts: [{ partNumber, etag }] }`.

Batalkan dengan [`/abort`](/api/operations/abortmediaupload/). Upload yang belum selesai tidak muncul di pustaka.

## Yang diukur PostFlow

Gambar diukur otomatis (lebar dan tinggi). Video tidak bisa diukur di server, jadi kirim ukuran dan durasinya. Tanpa itu, pre-flight
tidak bisa memeriksa rasio aspek atau durasi dan hanya memberi warning (`media_dimensions_unknown`).

| | |
|---|---|
| Jenis | JPEG, PNG, WebP, GIF, MP4, MOV, WebM |
| Ukuran | Gambar 30 MB, video 1 GB (lebih kecil per platform, lihat [Platform](/id/platforms/)) |
| Penyimpanan | Dihitung terhadap paket; `402 PLAN_LIMIT` kalau penuh |

## Pustaka

- [`GET /media`](/api/operations/listmedia/): terbaru dulu, dengan `usedIn` (jumlah post yang memakai file); filter `kind` atau nama (`q`).
- [`GET /media/{id}/file`](/api/operations/downloadmedia/): file-nya sendiri (`?thumb=1` untuk thumbnail video). Field `url` di respons
  adalah path aplikasi; lewat API, pakai endpoint ini.
- [`DELETE /media/{id}`](/api/operations/deletemedia/): hanya file yang tidak dipakai post. [`POST /media/delete`](/api/operations/deletemediabulk/)
  menghapus sampai 100 dan melewati yang masih dipakai.

Untuk crop atau mengonversi foto bagi suatu platform, buka post di aplikasi: composer menawarkan perbaikan sekali klik.