{"_id":"@bozonx/social-posting-dailymotion","name":"@bozonx/social-posting-dailymotion","dist-tags":{"latest":"0.8.0"},"versions":{"0.8.0":{"name":"@bozonx/social-posting-dailymotion","version":"0.8.0","description":"Dailymotion platform for @bozonx/social-posting","keywords":["social-media","posting","dailymotion"],"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","workerd":"./dist/index.js","import":"./dist/index.js","default":"./dist/index.js"}},"dependencies":{},"peerDependencies":{"@bozonx/social-posting":"^0.8.0"},"devDependencies":{"@bozonx/social-posting":"0.8.0","@bozonx/social-posting-conformance":"0.8.0"},"publishConfig":{"access":"public","provenance":true},"sideEffects":false,"author":"Ivan K","license":"MIT","engines":{"node":">=24.0.0"},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_nodeVersion":"24.19.0","_id":"@bozonx/social-posting-dailymotion@0.8.0","dist":{"integrity":"sha512-URCW5XN4ddzSazMnOvUuw4IfXyNn1BmZ28o6R3bnqGSjkvecpoWxxLcK7bPbuCVlE0cPbnqRAe73Y65bp0GATA==","shasum":"a317d4bb79705ac68daf3d5bdc29122ddbf5bdb5","tarball":"https://registry.npmjs.org/@bozonx/social-posting-dailymotion/-/social-posting-dailymotion-0.8.0.tgz","fileCount":21,"unpackedSize":68090,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDmkNdbFanUQHdUArIFrpIupoIWn0Cl+goiAZg9Ak2tYAIgdTt1pFl0JsUAijZIdfkVd93r1SE3YdcpxS/kl5BSgWE="}]},"_npmUser":{"name":"bozonx","email":"ipkozyrin@gmail.com"},"directories":{},"maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/social-posting-dailymotion_0.8.0_1788181096833_0.04696945693743926"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-31T12:58:16.590Z","0.8.0":"2026-08-31T12:58:16.984Z","modified":"2026-08-31T12:58:17.263Z"},"maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"description":"Dailymotion platform for @bozonx/social-posting","keywords":["social-media","posting","dailymotion"],"author":"Ivan K","license":"MIT","readme":"# @bozonx/social-posting-dailymotion\n\nDailymotion support for [`@bozonx/social-posting`](https://www.npmjs.com/package/@bozonx/social-posting).\nZero runtime dependencies, Web APIs only — it runs on Node, Bun, Deno and Cloudflare Workers.\n\n```bash\npnpm add @bozonx/social-posting @bozonx/social-posting-dailymotion\n```\n\n```ts\nimport { createPostingClient } from '@bozonx/social-posting';\nimport { dailymotion } from '@bozonx/social-posting-dailymotion';\n\nconst client = createPostingClient({\n  platforms: [dailymotion],\n  credentialProvider, // Dailymotion tokens expire; see \"Credentials\"\n  accounts: {\n    channel: {\n      platform: 'dailymotion',\n      auth: { accessToken: '…', refreshToken: '…', expiresAt: '…' },\n      oauthClient: {\n        clientId: process.env.DM_CLIENT_ID!,\n        clientSecret: process.env.DM_CLIENT_SECRET,\n      },\n    },\n  },\n});\n\nconst result = await client.post({\n  platform: 'dailymotion',\n  account: 'channel',\n  type: 'video',\n  title: 'Release notes, August',\n  body: 'Everything that shipped this month.',\n  media: [{ type: 'video', source: { kind: 'url', url: 'https://cdn.example.com/august.mp4' } }],\n});\n\n// result.data.status === 'processing' — see below.\n```\n\n## Three steps, and only the last one creates anything\n\n1. `GET /file/upload` issues a short-lived, single-use signed upload URL.\n2. The file is `POST`ed to that URL as `multipart/form-data`, in one request.\n3. `POST /me/videos` creates the video, pointing at what was uploaded.\n\nNothing exists as a video until step 3 succeeds. A failure in step 2 leaves an orphaned file that\nDailymotion discards on its own.\n\n**Step 2 cannot be resumed.** The upload endpoint has no offset protocol, so an interrupted upload\nstarts over. This adapter therefore issues **no resume handle for the upload** — a handle that\ncannot actually resume is worse than none, because a host would keep progress it can never\ncontinue from. `runChunkedUpload()` is deliberately not used here.\n\n## An uploaded video is not a published video\n\n`publish()` returns `processing` with a handle; the host polls `checkStatus()` until Dailymotion's\n`status` reads `published`, or one of `encoding_error` / `rejected` / `deleted`.\n\nBudget the wait from `capabilities.asyncProcessing` rather than from a constant of your own.\n\n## Credentials\n\nDailymotion access tokens expire. Supply a `credentialProvider` whose `onCredentialsRefreshed()`\npersists the result, and put `oauthClient.clientId` (with the secret, for a confidential client) on\nthe account. Without both, the account works until the current token lapses and then needs a human.\n\nThe `manage_videos` scope is required; a token issued without it authenticates and then refuses\nevery upload.\n\n## What it publishes\n\n| Field                    | Maps to                                              |\n| ------------------------ | ---------------------------------------------------- |\n| `title`                  | `title` (required, ≤ 255)                            |\n| `body` / `description`   | `description` (≤ 3000)                               |\n| `tags`                   | `tags`, comma-joined (≤ 20)                          |\n| `language`               | `language`                                           |\n| `visibility`             | `published` — `public` → true, anything else → false |\n| `extra.channel`          | `channel`, Dailymotion's own content category        |\n| `extra.isCreatedForKids` | `is_created_for_kids`                                |\n| `extra.geoblocking`      | `geoblocking`                                        |\n\nThe default is **private**: a mis-wired host must not publish to the world by omission.\n\n## Known limits\n\n- Videos only. No text posts, no images, no galleries, no stories, and no Shorts equivalent —\n  a vertical video is an ordinary upload, so `shortVideo` is absent rather than aliased to `video`.\n- There is no draft and no publish-later endpoint. `mode: 'draft'` and `scheduledAt` are refused\n  rather than silently dropped; schedule the job on your side instead.\n- Upload count and total published duration are capped by account status (ordinary, verified,\n  partner) rather than by anything the API states. Exhaustion arrives as a `limit_reached_error`\n  and is classified as `QUOTA_EXCEEDED`.\n- `delete()` is not implemented in this iteration, and `supportsDeletion` says so.\n","readmeFilename":"","_rev":"1-f82f3e0062722ca02058fbea369f8342"}