embystream 0.0.21

Another Emby streaming application (frontend/backend separation) written in Rust.
Documentation
{
  "cli.about": "Emby streaming proxy: run frontend, backend, or dual gateways from TOML config.",
  "cli.arg.lang": "UI language: en (default) or zh (Simplified Chinese); affects config wizard and --help.",
  "cli.config.about": "Interactive TOML configuration wizard (prompt language follows `--lang`).",
  "cli.config.show.about": "List valid TOML configs here and print one (mask secrets unless you confirm).",
  "cli.config.template.about": "Interactive: pick stream_mode and write a starter TOML (via temp file, then atomically).",
  "cli.run.about": "Start HTTP gateways (default when no subcommand: use `run` explicitly).",
  "cli.run.arg.config": "Path to config.toml.",
  "cli.run.arg.ssl_cert_file": "Override TLS cert path (PEM) from config.",
  "cli.run.arg.ssl_key_file": "Override TLS private key path (PEM) from config.",
  "cli.sub.help.about": "Print this message or the help of the given subcommand(s)",
  "error.wizard_prefix": "config wizard",
  "regex.error.invalid": "Invalid regex: {detail}. Try again or fix the pattern.",
  "regex.output.group": "group {idx}: {value}",
  "regex.output.matches": "matches: {value}",
  "wizard.banner.subtitle": "Interactive TOML wizard — prompt language follows `--lang`.",
  "wizard.banner.title": "EmbyStream configuration",
  "wizard.confirm.add_another_backend_node": "Add another BackendNode?",
  "wizard.confirm.add_backend_node": "Add a BackendNode?",
  "wizard.confirm.add_path_rewrite_entry": "Add a PathRewrite entry?",
  "wizard.confirm.create_another_config": "Create another new configuration?",
  "wizard.confirm.enable_path_rewrite_rule": "Enable this PathRewrite rule?",
  "wizard.confirm.open_regex_playground": "Open regex match playground?",
  "wizard.confirm.permanent_delete": "Permanently delete {path}?",
  "wizard.confirm.probe_emby_before_stream": "Probe Emby before streaming?",
  "wizard.confirm.regex_playground_for_pattern": "Open regex match playground for this pattern?",
  "wizard.confirm.show_secrets_plain": "Show secrets in plain text? (unsafe if others can see your screen)",
  "wizard.confirm.write_config_disk": "Write this configuration to disk?",
  "wizard.display.auto_generated": "(auto-generated)",
  "wizard.display.empty": "(empty)",
  "wizard.display.secret_masked": "· · ·",
  "wizard.error.dual_must_differ_backend_port": "Must differ from Backend.listen_port in dual mode.",
  "wizard.error.dual_must_differ_frontend_port": "Must differ from Frontend.listen_port in dual mode.",
  "wizard.error.dual_port": "Dual mode: frontend listen_port {port} cannot equal backend listen_port. Change one of them.",
  "wizard.error.file_exists": "That file already exists. Choose another name.",
  "wizard.error.integer_invalid": "Enter a valid integer.",
  "wizard.error.no_configs_to_copy": "No config files to copy.",
  "wizard.error.no_configs_to_delete": "No config files to delete.",
  "wizard.error.no_configs_to_edit": "No config files to edit.",
  "wizard.error.no_configs_to_rename": "No config files to rename.",
  "wizard.error.no_valid_toml_here": "No valid EmbyStream TOML files in this directory.",
  "wizard.error.non_negative_integer": "Enter a valid non-negative integer.",
  "wizard.error.port_range": "Enter a number between 0 and 65535.",
  "wizard.error.regex_pattern_invalid": "invalid regex pattern",
  "wizard.error.target_exists": "Target already exists.",
  "wizard.error.value_required": "A value is required.",
  "wizard.example.disk.description": "local NAS",
  "wizard.example.file.fallback_mp4": "/mnt/media/fallback.mp4",
  "wizard.example.host.stream_example": "stream.example.com",
  "wizard.example.name.my_openlist": "MyOpenList",
  "wizard.example.path.openlist_segment": "openlist",
  "wizard.example.port.alist": "5244",
  "wizard.example.problematic_clients": "yamby, hills, embytolocalplayer, Emby/",
  "wizard.example.regex.openlist_path": "/openlist/.*",
  "wizard.example.regex.path_rewrite_media": "^/media(/.*)$",
  "wizard.example.regex_group_1": "$1",
  "wizard.example.token.paste_here": "paste_token_here",
  "wizard.example.toml.host_line": "host = \"stream.example.com\"",
  "wizard.example.url.emby_https": "https://emby.example.com",
  "wizard.example.url.lan_emby_host": "192.168.1.1:8096",
  "wizard.example.url.lan_emby_http": "http://192.168.1.1:8096",
  "wizard.example.url.local_emby": "http://127.0.0.1",
  "wizard.example.url.stream_https": "https://stream.example.com",
  "wizard.example.user_agent.mozilla": "Mozilla/5.0",
  "wizard.field.allow_ua": "allow_ua",
  "wizard.field.base_url": "base_url",
  "wizard.field.check_file_existence": "check_file_existence",
  "wizard.field.client_burst_speed_kbs": "client_burst_speed_kbs",
  "wizard.field.client_speed_limit_kbs": "client_speed_limit_kbs",
  "wizard.field.deny_ua": "deny_ua",
  "wizard.field.description": "description",
  "wizard.field.encipher_iv": "encipher_iv",
  "wizard.field.encipher_key": "encipher_key",
  "wizard.field.file": "file",
  "wizard.field.file_name": "file_name",
  "wizard.field.host": "host",
  "wizard.field.idx": "idx",
  "wizard.field.level": "level",
  "wizard.field.listen_port": "listen_port",
  "wizard.field.memory_mode": "memory_mode",
  "wizard.field.mode": "mode",
  "wizard.field.name": "name",
  "wizard.field.password": "password",
  "wizard.field.path": "path",
  "wizard.field.pattern": "pattern",
  "wizard.field.port": "port",
  "wizard.field.prefix": "prefix",
  "wizard.field.priority": "priority",
  "wizard.field.problematic_clients": "problematic_clients",
  "wizard.field.proxy_mode": "proxy_mode",
  "wizard.field.query_param": "query_param",
  "wizard.field.replacement": "replacement",
  "wizard.field.root_path": "root_path",
  "wizard.field.ssl_cert_file": "ssl_cert_file",
  "wizard.field.ssl_key_file": "ssl_key_file",
  "wizard.field.stream": "stream",
  "wizard.field.stream_mode": "stream_mode",
  "wizard.field.token": "token",
  "wizard.field.type": "type",
  "wizard.field.url": "url",
  "wizard.field.url_mode": "url_mode",
  "wizard.field.url_template": "url_template",
  "wizard.field.user_agent": "user_agent",
  "wizard.field.username": "username",
  "wizard.field.video_missing_path": "video_missing_path",
  "wizard.hint.press_enter_auto_generate": "(auto-generate on Enter)",
  "wizard.hint.stream_mode.backend": "backend: signed stream gateway + storage nodes.",
  "wizard.hint.stream_mode.dual": "dual: both; frontend and backend must use different listen_port.",
  "wizard.hint.stream_mode.frontend": "frontend: proxy clients to Emby only.",
  "wizard.hint.webdav_url_mode_values": "path_join | query_path | url_template",
  "wizard.internal.scheme_delimiter": "://",
  "wizard.label.anti_reverse_proxy": "AntiReverseProxy",
  "wizard.label.default_prefix": "Default: ",
  "wizard.label.example_prefix": "Example: ",
  "wizard.label.path_rewrite": "PathRewrite",
  "wizard.menu.backend_nodes": "Backend nodes",
  "wizard.menu.backend_section": "Backend section",
  "wizard.menu.change_backend_listen_port": "Change Backend.listen_port",
  "wizard.menu.change_frontend_listen_port": "Change Frontend.listen_port",
  "wizard.menu.copy": "Copy",
  "wizard.menu.delete": "Delete",
  "wizard.menu.done_save": "Done (save)",
  "wizard.menu.edit_existing": "Edit existing",
  "wizard.menu.edit_shared_group": "Log / General / Emby / UserAgent / Http2 / Fallback",
  "wizard.menu.frontend_section": "Frontend section",
  "wizard.menu.main": "Main menu",
  "wizard.menu.new_config_file": "New configuration file",
  "wizard.menu.quit": "Quit",
  "wizard.menu.rename": "Rename",
  "wizard.menu.select_file_copy": "Select file to copy",
  "wizard.menu.select_file_delete": "Select file to delete",
  "wizard.menu.select_file_display": "Select file to display",
  "wizard.menu.select_file_edit": "Select file to edit",
  "wizard.menu.select_file_rename": "Select file to rename",
  "wizard.msg.prefix.wrote": "Wrote ",
  "wizard.msg.prefix.wrote_template": "Wrote template ",
  "wizard.msg.skipped_empty_pattern": "Skipped entry (empty pattern).",
  "wizard.msg.status.copied": "Copied.",
  "wizard.msg.status.deleted": "Deleted.",
  "wizard.msg.status.discarded": "Discarded.",
  "wizard.msg.status.renamed": "Renamed.",
  "wizard.msg.status.saved": "Saved.",
  "wizard.no": "No",
  "wizard.option.backend_type.direct_link": "DirectLink — plain HTTP fetch with custom User-Agent",
  "wizard.option.backend_type.disk": "Disk — local filesystem root",
  "wizard.option.backend_type.openlist": "OpenList — AList/OpenList HTTP API",
  "wizard.option.backend_type.stream_relay": "StreamRelay — 307 relay signed /stream to another backend",
  "wizard.option.backend_type.webdav_long": "WebDav — WebDAV upstream",
  "wizard.option.memory.high": "high — more aggressive caching",
  "wizard.option.memory.high_token": "high",
  "wizard.option.memory.low": "low — minimal caching",
  "wizard.option.memory.low_token": "low",
  "wizard.option.memory.middle": "middle — balanced (default)",
  "wizard.option.proxy_mode.proxy_long": "proxy — server fetches upstream",
  "wizard.option.proxy_mode.redirect_long": "redirect — client follows Location",
  "wizard.option.stream_mode.backend": "backend",
  "wizard.option.stream_mode.dual": "dual",
  "wizard.option.stream_mode.frontend": "frontend",
  "wizard.option.ua_mode.allow": "allow — only listed User-Agent tokens pass",
  "wizard.option.ua_mode.deny": "deny — listed User-Agent tokens are blocked",
  "wizard.placeholder.paren_none": "(none)",
  "wizard.placeholder.question_mark": "?",
  "wizard.placeholder.spaces_three": "   ",
  "wizard.prompt.alist_api_token": "AList API token.",
  "wizard.prompt.alist_base_url": "AList base URL.",
  "wizard.prompt.alist_port_if_missing": "AList port if not in URL.",
  "wizard.prompt.anti_reverse_reject_bad_host": "Reject requests whose Host header does not match trusted host when enabled.",
  "wizard.prompt.backend_listen_port_tcp": "TCP port for backend gateway (HTTPS if certs configured).",
  "wizard.prompt.backend_public_base_url": "Public base URL clients use to reach this backend.",
  "wizard.prompt.check_file_existence_true": "When true, verify the resource exists on Emby before streaming.",
  "wizard.prompt.choose_config_section": "Choose a config section to change (↑ / ↓ and Enter).",
  "wizard.prompt.choose_stream_mode_three": "Choose frontend, backend, or dual (↑ / ↓ and Enter).",
  "wizard.prompt.client_burst_kibs": "Burst allowance in KiB/s (0 = default / none).",
  "wizard.prompt.client_speed_limit_kibs": "Per-client speed limit in KiB/s (0 = unlimited).",
  "wizard.prompt.direct_link_fetch_ua": "User-Agent header for upstream fetch.",
  "wizard.prompt.edit_which_part": "Edit which part",
  "wizard.prompt.emby_api_token": "Emby API access token from dashboard.",
  "wizard.prompt.emby_base_url": "Base URL of your Emby server (no trailing path). Press Enter for http://127.0.0.1. You may omit the scheme (e.g. 127.0.0.1); http:// is added automatically.",
  "wizard.prompt.emby_http_port": "Emby HTTP port (omit if url already includes port).",
  "wizard.prompt.enable_anti": "Enable {ctx}? (reject requests when Host ≠ trusted host)",
  "wizard.prompt.encipher_iv_aes": "AES IV for stream signing (keep secret). Press Enter to auto-generate 16 random letters and digits (mixed case); or type your own value.",
  "wizard.prompt.encipher_key_aes": "AES key material for stream signing (keep secret). Press Enter to auto-generate 16 random letters and digits (mixed case); or type your own value.",
  "wizard.prompt.frontend_listen_port_tcp": "TCP port this process listens on for frontend clients.",
  "wizard.prompt.log_level_tracing": "tracing filter for the app (info/warn/debug/error)",
  "wizard.prompt.log_prefix_optional": "optional prefix for log file names.",
  "wizard.prompt.log_root_path": "directory for log files (created on run if possible).",
  "wizard.prompt.memory_mode_explainer": "cache footprint hint used by the app (low / middle / high).",
  "wizard.prompt.new_config_stream_mode": "Choose stream_mode. A comment-free starter TOML is built in a temp file, then written atomically to the name you choose.",
  "wizard.prompt.new_file_name": "New file name",
  "wizard.prompt.new_file_name_example": "New file name (e.g. my.toml)",
  "wizard.prompt.node_description_note": "Optional human note (not used for routing).",
  "wizard.prompt.node_log_label": "Short label for logs (unique recommended).",
  "wizard.prompt.node_path_append": "Path segment appended to base (no leading slash required).",
  "wizard.prompt.node_path_regex": "Rust regex on request path; empty uses path-prefix fallback rules.",
  "wizard.prompt.node_priority_order": "Lower runs earlier when multiple nodes match.",
  "wizard.prompt.node_storage_kind": "Storage or upstream kind for this node.",
  "wizard.prompt.node_upstream_origin": "Upstream origin for this node (scheme + host).",
  "wizard.prompt.node_upstream_port": "Upstream port (empty if not needed).",
  "wizard.prompt.optional_custom_user_agent": "Optional custom User-Agent.",
  "wizard.prompt.optional_http_basic_password": "Optional HTTP basic password.",
  "wizard.prompt.optional_http_basic_user": "Optional HTTP basic user.",
  "wizard.prompt.path_rewrite_before_upstream": "Rewrite path before hitting upstream.",
  "wizard.prompt.path_rewrite_rust_regex": "Rust regex applied to the path when enable=true.",
  "wizard.prompt.path_rewrite_to_emby_cdn": "Rewrite outgoing paths to Emby/CDN.",
  "wizard.prompt.pick_action_arrows": "Pick an action (↑ / ↓ and Enter).",
  "wizard.prompt.pick_frontend_or_backend_port": "Pick Frontend or Backend listen_port to edit.",
  "wizard.prompt.problematic_clients_csv": "Comma-separated substrings of User-Agent to treat specially.",
  "wizard.prompt.proxy_mode_long": "redirect: client follows Location; proxy: server fetches upstream.",
  "wizard.prompt.published_url_port": "Port embedded in published URLs (often 443).",
  "wizard.prompt.replacement_capture_groups": "Replacement string (supports capture groups).",
  "wizard.prompt.ssl_cert_pem_path": "PEM certificate path for backend HTTPS (empty = default layout next to config).",
  "wizard.prompt.ssl_private_key_pem_path": "PEM private key path.",
  "wizard.prompt.stream_url_path_prefix": "URL path prefix for stream routes (e.g. stream).",
  "wizard.prompt.trusted_host_header": "Trusted Host header when anti-reverse-proxy is enabled.",
  "wizard.prompt.ua_mode_explainer": "allow: only listed User-Agent tokens pass; deny: listed tokens are blocked.",
  "wizard.prompt.ua_token_one_per_line": "One token per line; empty line finishes the list.",
  "wizard.prompt.user_agent_allow_tokens": "Tokens matched as substrings of the client User-Agent; matching is case-insensitive. In allow mode, only matching clients pass.",
  "wizard.prompt.user_agent_deny_tokens": "Tokens matched as substrings of the client User-Agent; matching is case-insensitive. In deny mode, matching clients are blocked.",
  "wizard.prompt.video_missing_local_file": "Local file served when a video resource is missing (empty to disable).",
  "wizard.prompt.webdav_query_param_key": "Query key when url_mode=query_path.",
  "wizard.prompt.webdav_url_template": "When url_mode=url_template, URL with {file_path} placeholder.",
  "wizard.prompt.which_port_to_change": "Which port to change",
  "wizard.prompt.write_under_cwd": "Write under the current directory (bare file name or relative path).",
  "wizard.section.backend": "Backend",
  "wizard.section.backend_node": "BackendNode",
  "wizard.section.backend_node_webdav": "BackendNode.WebDav",
  "wizard.section.configs_in_cwd": "Configurations in current directory",
  "wizard.section.configuration_template": "Configuration template",
  "wizard.section.emby": "Emby",
  "wizard.section.fallback": "Fallback",
  "wizard.section.file_content": "File content",
  "wizard.section.frontend": "Frontend",
  "wizard.section.general": "General",
  "wizard.section.http2": "Http2 (TLS cert paths, optional)",
  "wizard.section.log": "Log",
  "wizard.section.masked_content": "Masked content",
  "wizard.section.preview_toml": "Preview (comment-free TOML)",
  "wizard.section.stream_mode": "Stream mode",
  "wizard.section.user_agent": "UserAgent",
  "wizard.tip.field_input": "Tip: Press Enter to keep the default from the field line (Default: …), or type a new value and press Enter.",
  "wizard.tip.select_file_list": "Tip: ↑ / ↓ and Enter to choose · Esc or q to go back",
  "wizard.value.backend_type.direct_link": "DirectLink",
  "wizard.value.backend_type.disk": "Disk",
  "wizard.value.backend_type.openlist": "OpenList",
  "wizard.value.proxy_mode.proxy": "proxy",
  "wizard.value.proxy_mode.redirect": "redirect",
  "wizard.yes": "Yes"
}