How youtube-dl Handles Extractor Authentication Using .netrc Files

youtube-dl reads login credentials from .netrc files when the --netrc flag is enabled, automatically supplying them to extractors based on machine names defined in the InfoExtractor base class.

youtube-dl supports automatic credential retrieval from .netrc files to streamline authentication across hundreds of supported sites. This mechanism allows users to store passwords securely in a standard Unix configuration file rather than passing them as command-line arguments. Understanding how youtube-dl extractor authentication using .netrc files works requires examining the core option parser and the InfoExtractor base class implementation in the ytdl-org/youtube-dl repository.

Enabling .netrc Support via Command-Line Options

The authentication process begins with the --netrc (or short -n) command-line flag defined in youtube_dl/options.py at lines 64-66. When invoked, this option sets the usenetrc parameter to True, signaling the downloader to check for credentials in the user's .netrc file before attempting unauthenticated requests.

The Credential Retrieval Pipeline

When an extractor requires authentication, it invokes the _get_login_info method defined in youtube_dl/extractor/common.py at lines 96-102. This method implements a priority-based fallback system:

  1. Explicit credentials supplied via --username and --password take precedence
  2. If explicit credentials are absent, the method falls back to _get_netrc_login_info

Parsing the .netrc File

The _get_netrc_login_info method handles the actual file parsing using Python's standard netrc module according to the implementation at lines 66-78 in youtube_dl/extractor/common.py. It checks the usenetrc flag, determines the appropriate machine name (either provided by the caller or extracted from the _NETRC_MACHINE class attribute), and retrieves the authenticators. If the entry exists, it returns a tuple of (login, password). Errors such as missing files, parse failures, or absent entries are reported as warnings rather than fatal exceptions.

Extractor-Specific Machine Names

Each extractor that supports .netrc authentication defines a _NETRC_MACHINE class attribute matching the machine name expected in the .netrc file. For example, the YouTube extractor uses "youtube" as its machine identifier. This pattern is demonstrated in youtube_dl/extractor/vk.py at lines 588-600, where the extractor calls self._get_login_info(netrc_machine='vk') to request credentials specifically for the VK platform.

Configuring Your .netrc File for youtube-dl

To utilize youtube-dl extractor authentication using .netrc files, create a .netrc file in your home directory with restricted permissions and extractor-specific entries as documented in README.md lines 508-525.

Setting File Permissions

The .netrc file must be readable only by the owner to prevent credential exposure. Set permissions using:

chmod 600 "$HOME/.netrc"

Machine Entry Syntax

Add entries following the standard .netrc format with machine names matching the extractor's _NETRC_MACHINE value:

cat >> "$HOME/.netrc" <<EOF
machine youtube login myaccount@gmail.com password my_youtube_password
machine twitch login my_twitch_user password my_twitch_password
machine vk login my_vk_email password my_vk_pass
EOF

Practical Usage Examples

Enable .netrc authentication when downloading content:

youtube-dl --netrc "https://www.youtube.com/watch?v=example"

Inside an extractor implementation, credentials are retrieved programmatically:

def _real_extract(self, url):
    username, password = self._get_login_info(netrc_machine='youtube')
    # Credentials now contain .netrc values if present and flag is enabled

Summary

  • Enable authentication with the --netrc or -n flag defined in youtube_dl/options.py lines 64-66
  • Credential priority favors explicit --username/--password arguments, falling back to .netrc via _get_login_info in youtube_dl/extractor/common.py lines 96-102
  • File parsing occurs in _get_netrc_login_info (lines 66-78) using Python's netrc module with comprehensive error handling
  • Machine names are extractor-specific (e.g., youtube, vk) defined by the _NETRC_MACHINE attribute as shown in youtube_dl/extractor/vk.py lines 588-600
  • Security requires chmod 600 permissions on the .netrc file to prevent unauthorized access

Frequently Asked Questions

What permissions should the .netrc file have?

The .netrc file must have 600 permissions (readable and writable only by the owner). youtube-dl and the underlying Python netrc module may refuse to read the file or issue security warnings if group or world read permissions are set. Use chmod 600 ~/.netrc to set the correct access controls according to the README documentation.

Can I use .netrc alongside explicit username and password arguments?

Yes, but explicit arguments take precedence. According to the implementation in youtube_dl/extractor/common.py lines 96-102, if you provide --username and --password, youtube-dl uses those values and skips the .netrc lookup entirely. The .netrc file serves as a fallback when explicit credentials are not provided.

How do I find the correct machine name for a specific extractor?

The machine name corresponds to the extractor's _NETRC_MACHINE class attribute. While the README (lines 508-525) documents common names like youtube and twitch, you can verify the exact string by checking the extractor's source code in youtube_dl/extractor/ or examining calls to _get_login_info where the netrc_machine parameter is explicitly passed, as seen in youtube_dl/extractor/vk.py.

What happens if the .netrc file is missing or contains syntax errors?

youtube-dl treats .netrc errors as warnings rather than fatal failures. If the file is missing, unreadable, or malformed, _get_netrc_login_info catches these exceptions and emits a warning message, then proceeds as if no credentials were found. The download may continue unauthenticated or prompt for credentials depending on the extractor's requirements.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →