npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@bozonx/social-posting-dailymotion

v0.8.0

Published

Dailymotion platform for @bozonx/social-posting

Readme

@bozonx/social-posting-dailymotion

Dailymotion support for @bozonx/social-posting. Zero runtime dependencies, Web APIs only — it runs on Node, Bun, Deno and Cloudflare Workers.

pnpm add @bozonx/social-posting @bozonx/social-posting-dailymotion
import { createPostingClient } from '@bozonx/social-posting';
import { dailymotion } from '@bozonx/social-posting-dailymotion';

const client = createPostingClient({
  platforms: [dailymotion],
  credentialProvider, // Dailymotion tokens expire; see "Credentials"
  accounts: {
    channel: {
      platform: 'dailymotion',
      auth: { accessToken: '…', refreshToken: '…', expiresAt: '…' },
      oauthClient: {
        clientId: process.env.DM_CLIENT_ID!,
        clientSecret: process.env.DM_CLIENT_SECRET,
      },
    },
  },
});

const result = await client.post({
  platform: 'dailymotion',
  account: 'channel',
  type: 'video',
  title: 'Release notes, August',
  body: 'Everything that shipped this month.',
  media: [{ type: 'video', source: { kind: 'url', url: 'https://cdn.example.com/august.mp4' } }],
});

// result.data.status === 'processing' — see below.

Three steps, and only the last one creates anything

  1. GET /file/upload issues a short-lived, single-use signed upload URL.
  2. The file is POSTed to that URL as multipart/form-data, in one request.
  3. POST /me/videos creates the video, pointing at what was uploaded.

Nothing exists as a video until step 3 succeeds. A failure in step 2 leaves an orphaned file that Dailymotion discards on its own.

Step 2 cannot be resumed. The upload endpoint has no offset protocol, so an interrupted upload starts over. This adapter therefore issues no resume handle for the upload — a handle that cannot actually resume is worse than none, because a host would keep progress it can never continue from. runChunkedUpload() is deliberately not used here.

An uploaded video is not a published video

publish() returns processing with a handle; the host polls checkStatus() until Dailymotion's status reads published, or one of encoding_error / rejected / deleted.

Budget the wait from capabilities.asyncProcessing rather than from a constant of your own.

Credentials

Dailymotion access tokens expire. Supply a credentialProvider whose onCredentialsRefreshed() persists the result, and put oauthClient.clientId (with the secret, for a confidential client) on the account. Without both, the account works until the current token lapses and then needs a human.

The manage_videos scope is required; a token issued without it authenticates and then refuses every upload.

What it publishes

| Field | Maps to | | ------------------------ | ---------------------------------------------------- | | title | title (required, ≤ 255) | | body / description | description (≤ 3000) | | tags | tags, comma-joined (≤ 20) | | language | language | | visibility | publishedpublic → true, anything else → false | | extra.channel | channel, Dailymotion's own content category | | extra.isCreatedForKids | is_created_for_kids | | extra.geoblocking | geoblocking |

The default is private: a mis-wired host must not publish to the world by omission.

Known limits

  • Videos only. No text posts, no images, no galleries, no stories, and no Shorts equivalent — a vertical video is an ordinary upload, so shortVideo is absent rather than aliased to video.
  • There is no draft and no publish-later endpoint. mode: 'draft' and scheduledAt are refused rather than silently dropped; schedule the job on your side instead.
  • Upload count and total published duration are capped by account status (ordinary, verified, partner) rather than by anything the API states. Exhaustion arrives as a limit_reached_error and is classified as QUOTA_EXCEEDED.
  • delete() is not implemented in this iteration, and supportsDeletion says so.