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.
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
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
| Site | What can be imported | What is refused |
|---|---|---|
| YouTube | One video: youtube.com/watch?v=…, youtu.be/…, Shorts, finished live recordings | Channels and playlists |
| Twitch | A recorded video (twitch.tv/videos/…) or a clip | A live channel: wait for the recording |
| Kick | A recorded video or a clip | A live channel |
| Direct links | An 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 TikTok | Never | Refused 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:
| Field | Default | Meaning |
|---|---|---|
| Import from a link | Off | The main switch |
| Path of yt-dlp | Empty | Full path, for example /usr/local/bin/yt-dlp. Needed for YouTube, Twitch and Kick links only. |
| Allowed sites | YouTube, Twitch, Kick | Also 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) | 180 | 1 to 1440. The plan's "Longest source video" also applies when the source is analysed. |
| Cookies file for yt-dlp (optional) | Empty | A path on the server, passed to the program as its cookies file |
| Proxy for imports (optional) | Empty | For example http://user:password@host:port. Stored sealed. |
| Twitch app client ID | Empty | With 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 stream | Off | Uses 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.