Vodmill docs
v1.0.0
Get help
● Set up · Import from a link

Imports
bringing a video in from a link, as an operator option.

Uploads always work. Importing from a link is off on a new install. It needs a switch in the console, a plan that includes it, and a permission statement from the person who imports. Links to YouTube, Twitch and Kick also need a program that you install on the server yourself; a direct link to a video file does not.

Off by defaultyt-dlp not bundledPermission statementNo Instagram or TikTok

01How it works

When imports are on, the "New source" dialog in the app gains a "Paste a link" tab. The person pastes the address of one video, confirms the statement "I own this content or have the owner's permission to clip it", and the server fetches that one video into the workspace library. From there it is a normal source.

These must all be true (src/server/jobs.ts, src/server/store-clips.ts):

  • Console, Product, Imports, "Import from a link" is on.
  • The link's kind is among the "Allowed sites". YouTube, Twitch and Kick count only when "Path of yt-dlp" is filled in; "Direct links to a video file" needs no extra program.
  • The workspace's plan has the limit "Import from a link" switched on (Plans page).
  • The person ticked the permission statement. The server stores who confirmed it and when, with the source.

02Your responsibility as the operator

Read this before you switch it on

Importing is meant for a creator's or a client's own videos and streams, and for content the user has permission to clip. The video platforms' terms of service restrict fetching their content, and copyright law applies to what your users bring in. Whether to offer this feature, and to whom, is your decision and your responsibility. Vodmill ships with it off, bundles no fetching program, and asks for the permission statement on every import; it cannot check that the statement is true. Put the rule into your own terms of service.

03Supported addresses

SiteWhat can be importedWhat is refused
YouTubeOne video: youtube.com/watch?v=…, youtu.be/…, Shorts, finished live recordingsChannels and playlists
TwitchA recorded video (twitch.tv/videos/…) or a clipA live channel: wait for the recording
KickA recorded video or a clipA live channel
Direct linksAn https link that ends in .mp4, .m4v, .mov, .webm, .mkv or .m3u8, on the public internet. The server fetches it itself, without yt-dlp.Addresses inside private networks, links with a user name or password
Instagram and TikTokNeverRefused in code, whatever the settings say: "Instagram and TikTok links cannot be imported. Upload the original file instead." (packages/ingest/src/url.ts)

Private, members-only and sign-in videos are not imported. Live streams are not imported while they are live.

04Install yt-dlp yourself

You need this only for YouTube, Twitch and Kick links. If you allow nothing but direct links to a video file, skip this section.

yt-dlp is a separate program with its own licence. It is not included in this package, and the author of Vodmill does not distribute it. If you decide to offer imports, install it from its own project page, github.com/yt-dlp/yt-dlp, following the instructions there. Its documented way for Linux is:

sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
/usr/local/bin/yt-dlp --version

That file needs Python 3 on the server (python3 --version). Keeping the program up to date is your task: sites change, and an old version stops working.

05Console settings

Console, Product, Imports:

FieldDefaultMeaning
Import from a linkOffThe main switch
Path of yt-dlpEmptyFull path, for example /usr/local/bin/yt-dlp. Needed for YouTube, Twitch and Kick links only.
Allowed sitesYouTube, Twitch, KickAlso selectable: "Direct links to a video file (.mp4, .mov, .webm, .mkv, .m3u8)". Without a yt-dlp path only this choice has an effect.
Longest import (minutes)1801 to 1440. The plan's "Longest source video" also applies when the source is analysed.
Cookies file for yt-dlp (optional)EmptyA path on the server, passed to the program as its cookies file
Proxy for imports (optional)EmptyFor example http://user:password@host:port. Stored sealed.
Twitch app client IDEmptyWith the client secret (Integrations): viewer-made top clips of a Twitch video become signals for the picker. Also used for Twitch view counts in campaigns.
Experimental: fetch the chat replay of a streamOffUses unofficial endpoints that can stop working at any time. Uploading a chat log always works.

The console's status check "Imports from a link can run" reports problems with this setup.

06Stream signals

For streams the picker can use two more signals, both optional:

  • A chat log uploaded to a source: Twitch and Kick chat exports (JSON or text), or lines like [1:02:03] name: message. Spikes in chat mark moments. Analyse the source again to use it.
  • Viewer-made clips of a Twitch video, read through Twitch's official API with your Twitch app keys.

07Limits and safety

  • One video per link; the address is rebuilt from the parts the server understood, so extra parameters never reach the program.
  • The picture is fetched at up to 1080 pixels high, as MP4.
  • Ten sources of one workspace may wait or import at a time.
  • Links the server fetches itself (direct links) must resolve to public internet addresses, on the usual web ports.
  • Bringing the video in costs no credits. The analysis is charged per minute once the video is in the library.