diff --git a/packages/envied/src/envied/envied-full-example.yaml b/packages/envied/src/envied/envied-example-full-reference.yaml similarity index 66% rename from packages/envied/src/envied/envied-full-example.yaml rename to packages/envied/src/envied/envied-example-full-reference.yaml index d6e08c2..60ca8c9 100644 --- a/packages/envied/src/envied/envied-full-example.yaml +++ b/packages/envied/src/envied/envied-example-full-reference.yaml @@ -17,15 +17,66 @@ tag_imdb_tmdb: true # Set terminal background color (custom option not in CONFIG.md) set_terminal_bg: false -# Set file naming convention -# true for style - Prime.Suspect.S07E01.The.Final.Act.Part.One.1080p.ITV.WEB-DL.AAC2.0.H.264 -# false for style - Prime Suspect S07E01 The Final Act - Part One -scene_naming: true +# Custom output templates for filenames +# Configure output_template in your unshackle.yaml to control filename format. +# If not configured, default scene-style templates are used and a warning is shown. +# Available variables: {title}, {year}, {season}, {episode}, {season_episode}, {episode_name}, +# {quality}, {resolution}, {source}, {audio}, {audio_channels}, {audio_full}, +# {video}, {hdr}, {hfr}, {atmos}, {dual}, {multi}, {tag}, {edition}, {repack}, +# {lang_tag} +# Conditional variables (included only if present): Add ? suffix like {year?}, {episode_name?}, {hdr?} +# Customize the templates below: +# +# Example outputs: +# Scene movies: 'The.Matrix.1999.1080p.SERVICE.WEB-DL.DDP5.1.H.264-EXAMPLE' +# Scene movies (HDR): 'Dune.2021.2160p.SERVICE.WEB-DL.DDP5.1.HDR10.H.265-EXAMPLE' +# Scene movies (REPACK): 'Dune.2021.REPACK.2160p.SERVICE.WEB-DL.DDP5.1.H.265-EXAMPLE' +# Scene series: 'Breaking.Bad.2008.S01E01.Pilot.1080p.SERVICE.WEB-DL.DDP5.1.H.264-EXAMPLE' +# Plex movies: 'The Matrix (1999) 1080p' +# Plex series: 'Breaking Bad S01E01 Pilot' +output_template: + # Scene-style naming (dot-separated) + movies: '{title}.{year}.{repack?}.{edition?}.{quality}.{source}.WEB-DL.{dual?}.{multi?}.{audio_full}.{atmos?}.{hdr?}.{hfr?}.{video}-{tag}' + series: '{title}.{year?}.{season_episode}.{episode_name?}.{repack?}.{edition?}.{quality}.{source}.WEB-DL.{dual?}.{multi?}.{audio_full}.{atmos?}.{hdr?}.{hfr?}.{video}-{tag}' + songs: '{track_number}.{title}.{repack?}.{edition?}.{source?}.WEB-DL.{audio_full}.{atmos?}-{tag}' + # + # Plex-friendly naming (space-separated, clean format) + # movies: '{title} ({year}) {quality}' + # series: '{title} {season_episode} {episode_name?}' + # songs: '{track_number}. {title}' + # + # Minimal naming (basic info only) + # movies: '{title}.{year}.{quality}' + # series: '{title}.{season_episode}.{episode_name?}' + # + # Custom scene-style with specific elements + # movies: '{title}.{year}.{quality}.{hdr?}.{source}.WEB-DL.{audio_full}.{video}-{tag}' + # series: '{title}.{year?}.{season_episode}.{episode_name?}.{quality}.{hdr?}.{source}.WEB-DL.{audio_full}.{atmos?}.{video}-{tag}' -# Whether to include the year in series names for episodes and folders (default: true) -# true for style - Show Name (2023) S01E01 Episode Name -# false for style - Show Name S01E01 Episode Name -series_year: true +# Language-based tagging for output filenames +# Automatically adds language identifiers (e.g., DANiSH, NORDiC, DKsubs) based on +# audio and subtitle track languages. Rules are evaluated in order; first match wins. +# Use {lang_tag?} in your output_template to place the tag in the filename. +# +# Conditions (all conditions in a rule must match): +# audio: - any audio track matches this language +# subs_contain: - any subtitle matches this language +# subs_contain_all: [lang, ...] - subtitles include ALL listed languages +# +# language_tags: +# rules: +# - audio: da +# tag: DANiSH +# - audio: sv +# tag: SWEDiSH +# - audio: nb +# tag: NORWEGiAN +# - audio: en +# subs_contain_all: [da, sv, nb] +# tag: NORDiC +# - audio: en +# subs_contain: da +# tag: DKsubs # Check for updates from GitHub repository on startup (default: true) update_checks: true @@ -39,6 +90,9 @@ title_cache_enabled: true # Enable/disable title caching globally (default: true title_cache_time: 1800 # Cache duration in seconds (default: 1800 = 30 minutes) title_cache_max_retention: 86400 # Maximum cache retention for fallback when API fails (default: 86400 = 24 hours) +# Filename Configuration +unicode_filenames: false # optionally replace non-ASCII characters with ASCII equivalents + # Debug logging configuration # Comprehensive JSON-based debug logging for troubleshooting and service development debug: @@ -62,6 +116,11 @@ debug_keys: # Muxing configuration muxing: set_title: false + # merge_audio: Merge all audio tracks into each output file + # true (default): All selected audio in one MKV per quality + # false: Separate MKV per (quality, audio_codec) combination + # Example: Title.1080p.AAC.mkv, Title.1080p.EC3.mkv + merge_audio: true # Login credentials for each Service credentials: @@ -264,6 +323,15 @@ remote_cdm: host: "https://keyxtractor.decryptlabs.com" secret: "your_decrypt_labs_api_key_here" + # PyPlayReady RemoteCdm - connects to an unshackle serve instance + - name: "playready_remote" + device_name: "my_prd_device" # Device name on the serve instance + device_type: PLAYREADY + system_id: 0 + security_level: 3000 # 2000 for SL2000, 3000 for SL3000 + host: "http://127.0.0.1:8786/playready" # Include /playready path + secret: "your-api-secret-key" + # Key Vaults store your obtained Content Encryption Keys (CEKs) # Use 'no_push: true' to prevent a vault from receiving pushed keys # while still allowing it to provide keys when requested @@ -336,7 +404,7 @@ headers: filenames: debug_log: "unshackle_debug_{service}_{time}.jsonl" # JSON Lines debug log file config: "config.yaml" - root_config: "envied.yaml" + root_config: "unshackle.yaml" chapters: "Chapters_{title}_{random}.txt" subtitle: "Subtitle_{id}_{language}.srt" @@ -364,17 +432,29 @@ subtitle: # When true, skips pycaption processing for WebVTT files to keep tags like , , positioning intact # Combined with no sub_format setting, ensures subtitles remain in their original format (default: true) preserve_formatting: true + # output_mode: Output mode for subtitles + # - mux: Embed subtitles in MKV container only (default) + # - sidecar: Save subtitles as separate files only + # - both: Embed in MKV AND save as sidecar files + output_mode: mux + # sidecar_format: Format for sidecar subtitle files + # Options: srt, vtt, ass, original (keep current format) + sidecar_format: srt -# Configuration for pywidevine's serve functionality +# Configuration for pywidevine and pyplayready's serve functionality serve: api_secret: "your-secret-key-here" users: secret_key_for_user: - devices: + devices: # Widevine devices (WVDs) this user can access - generic_nexus_4464_l3 + playready_devices: # PlayReady devices (PRDs) this user can access + - playready_device_sl3000 username: user - # devices: + # devices: # Widevine device paths (auto-populated from directories.wvds) # - '/path/to/device.wvd' + # playready_devices: # PlayReady device paths (auto-populated from directories.prds) + # - '/path/to/device.prd' # Configuration data for each Service services: @@ -408,6 +488,19 @@ services: app_name: "AIV" device_model: "Fire TV Stick 4K" + # Service-specific proxy mappings + # Override global proxy selection with specific servers for this service + # When --proxy matches a key in proxy_map, the mapped server will be used + # instead of the default/random server selection + proxy_map: + nordvpn:ca: ca1577 # Use ca1577 when --proxy nordvpn:ca is specified + nordvpn:us: us9842 # Use us9842 when --proxy nordvpn:us is specified + us: 123 # Use server 123 (from any provider) when --proxy us is specified + gb: 456 # Use server 456 (from any provider) when --proxy gb is specified + # Without this service, --proxy nordvpn:ca picks a random CA server + # With this config, --proxy nordvpn:ca EXAMPLE uses ca1577 specifically + # Other services or no service specified will still use random selection + # NEW: Configuration overrides (can be combined with profiles and certificates) # Override dl command defaults for this service dl: @@ -478,8 +571,15 @@ proxy_providers: nordvpn: username: username_from_service_credentials password: password_from_service_credentials + # server_map: global mapping that applies to ALL services + # Difference from service-specific proxy_map: + # - server_map: applies to ALL services when --proxy nordvpn:us is used + # - proxy_map: only applies to the specific service configured (see services: EXAMPLE: proxy_map above) + # - proxy_map takes precedence over server_map for that service server_map: us: 12 # force US server #12 for US proxies + ca:calgary: 2534 # force CA server #2534 for Calgary proxies + us:seattle: 7890 # force US server #7890 for Seattle proxies surfsharkvpn: username: your_surfshark_service_username # Service credentials from https://my.surfshark.com/vpn/manual-setup/main/openvpn password: your_surfshark_service_password # Service credentials (not your login password) @@ -487,12 +587,81 @@ proxy_providers: us: 3844 # force US server #3844 for US proxies gb: 2697 # force GB server #2697 for GB proxies au: 4621 # force AU server #4621 for AU proxies + us:seattle: 5678 # force US server #5678 for Seattle proxies + ca:toronto: 1234 # force CA server #1234 for Toronto proxies windscribevpn: username: your_windscribe_username # Service credentials from https://windscribe.com/getconfig/openvpn password: your_windscribe_password # Service credentials (not your login password) server_map: us: "us-central-096.totallyacdn.com" # force US server gb: "uk-london-055.totallyacdn.com" # force GB server + us:seattle: "us-west-011.totallyacdn.com" # force US Seattle server + ca:toronto: "ca-toronto-012.totallyacdn.com" # force CA Toronto server + + # Gluetun: Dynamic Docker-based VPN proxy (supports 50+ VPN providers) + # Creates Docker containers running Gluetun to bridge VPN connections to HTTP proxies + # Requires Docker to be installed and running + # Usage: --proxy gluetun:windscribe:us or --proxy gluetun:nordvpn:de + gluetun: + # Global settings + base_port: 8888 # Starting port for HTTP proxies (increments for each container) + auto_cleanup: true # Automatically remove containers when done + container_prefix: "unshackle-gluetun" # Docker container name prefix + verify_ip: true # Verify VPN IP matches expected region + # Optional HTTP proxy authentication (for the proxy itself, not VPN) + # auth_user: proxy_user + # auth_password: proxy_password + + # VPN provider configurations + providers: + # Windscribe (WireGuard) - Get credentials from https://windscribe.com/getconfig/wireguard + windscribe: + vpn_type: wireguard + credentials: + private_key: "YOUR_WIREGUARD_PRIVATE_KEY" + addresses: "YOUR_WIREGUARD_ADDRESS" # e.g., "10.x.x.x/32" + # Map friendly names to country codes + server_countries: + us: US + uk: GB + ca: CA + de: DE + + # NordVPN (OpenVPN) - Get service credentials from https://my.nordaccount.com/dashboard/nordvpn/manual-configuration/ + # Note: Service credentials are NOT your email+password - generate them from the link above + # nordvpn: + # vpn_type: openvpn + # credentials: + # username: "YOUR_NORDVPN_SERVICE_USERNAME" + # password: "YOUR_NORDVPN_SERVICE_PASSWORD" + # server_countries: + # us: US + # uk: GB + + # ExpressVPN (OpenVPN) - Get credentials from ExpressVPN setup page + # expressvpn: + # vpn_type: openvpn + # credentials: + # username: "YOUR_EXPRESSVPN_USERNAME" + # password: "YOUR_EXPRESSVPN_PASSWORD" + # server_countries: + # us: US + # uk: GB + + # Surfshark (WireGuard) - Get credentials from https://my.surfshark.com/vpn/manual-setup/main/wireguard + # surfshark: + # vpn_type: wireguard + # credentials: + # private_key: "YOUR_SURFSHARK_PRIVATE_KEY" + # addresses: "YOUR_SURFSHARK_ADDRESS" + # server_countries: + # us: US + # uk: GB + + # Specific server selection: Use format like "us1239" to select specific servers + # Example: --proxy gluetun:nordvpn:us1239 connects to us1239.nordvpn.com + # Supported providers: nordvpn, surfshark, expressvpn, cyberghost + basic: GB: - "socks5://username:password@bhx.socks.ipvanish.com:1080" # 1 (Birmingham) @@ -502,3 +671,4 @@ proxy_providers: - "https://username:password@au-syd.prod.surfshark.com" # 2 (Sydney) - "https://username:password@au-bne.prod.surfshark.com" # 3 (Brisbane) BG: "https://username:password@bg-sof.prod.surfshark.com" + diff --git a/packages/envied/src/envied/envied-example.yaml b/packages/envied/src/envied/envied-example.yaml deleted file mode 100644 index 31684d6..0000000 --- a/packages/envied/src/envied/envied-example.yaml +++ /dev/null @@ -1,233 +0,0 @@ -# Group or Username to postfix to the end of all download fienames following a dash -#tag: '' - -# Set terminal background color (custom option not in CONFIG.md) -set_terminal_bg: false - -# Muxing configuration -muxing: - set_title: false - -# shakapackager or mp4decrypt -decryption: shakapackager - -# Custom output templates for filenames -# Configure output_template in your unshackle.yaml to control filename format. -# If not configured, default scene-style templates are used and a warning is shown. -# Available variables: {title}, {year}, {season}, {episode}, {season_episode}, {episode_name}, -# {quality}, {resolution}, {source}, {audio}, {audio_channels}, {audio_full}, -# {video}, {hdr}, {hfr}, {atmos}, {dual}, {multi}, {tag}, {edition}, {repack}, -# {lang_tag} -# Conditional variables (included only if present): Add ? suffix like {year?}, {episode_name?}, {hdr?} -# Customize the templates below: -# -# Example outputs: -# Scene movies: 'The.Matrix.1999.1080p.SERVICE.WEB-DL.DDP5.1.H.264-EXAMPLE' -# Scene movies (HDR): 'Dune.2021.2160p.SERVICE.WEB-DL.DDP5.1.HDR10.H.265-EXAMPLE' -# Scene movies (REPACK): 'Dune.2021.REPACK.2160p.SERVICE.WEB-DL.DDP5.1.H.265-EXAMPLE' -# Scene series: 'Breaking.Bad.2008.S01E01.Pilot.1080p.SERVICE.WEB-DL.DDP5.1.H.264-EXAMPLE' -# Plex movies: 'The Matrix (1999)' -# Plex series: 'Breaking Bad S01E01 Pilot' -output_template: -# Scene-style naming (dot-separated) -# movies: '{title}.{year}.{repack?}.{edition?}.{quality}.{source}.WEB-DL.{dual?}.{multi?}.{audio_full}.{atmos?}.{hdr?}.{hfr?}.{video}-{tag}' -# series: '{title}.{year?}.{season_episode}.{episode_name?}.{repack?}.{edition?}.{quality}.{source}.WEB-DL.{dual?}.{multi?}.{audio_full}.{atmos?}.{hdr?}.{hfr?}.{video}-{tag}' -# songs: '{track_number}.{title}.{repack?}.{edition?}.{source?}.WEB-DL.{audio_full}.{atmos?}-{tag}' - # - # Plex-friendly naming (space-separated, clean format) - movies: '{title} ({year}) {quality}' - series: '{title} {season_episode} {episode_name?}' - songs: '{track_number}. {title}' - # -## Minimal naming (basic info only) -# movies: '{title}.{year}.{quality}' -# series: '{title}.{season_episode}.{episode_name?}' - -### Custom scene-style with specific elements -# movies: '{title}.{year}.{quality}.{hdr?}.{source}.WEB-DL.{audio_full}.{video}-{tag}' -# series: '{title}.{year?}.{season_episode}.{episode_name?}.{quality}.{hdr?}.{source}.WEB-DL.{audio_full}.{atmos?}.{video}-{tag}' - -# Language-based tagging for output filenames -# Automatically adds language identifiers (e.g., DANiSH, NORDiC, DKsubs) based on -# audio and subtitle track languages. Rules are evaluated in order; first match wins. -# Use {lang_tag?} in your output_template to place the tag in the filename. -# -# Conditions (all conditions in a rule must match): -# audio: - any audio track matches this language -# subs_contain: - any subtitle matches this language -# subs_contain_all: [lang, ...] - subtitles include ALL listed languages -# -# language_tags: -# rules: -# - audio: da -# tag: DANiSH -# - audio: sv -# tag: SWEDiSH -# - audio: nb -# tag: NORWEGiAN -# - audio: en -# subs_contain_all: [da, sv, nb] -# tag: NORDiC -# - audio: en -# subs_contain: da -# tag: DKsubs - - -# Widevine pssh display; fold, crop or ellipsis -pssh_display: ellipsis - -# Login credentials for each Service -credentials: - ALL4: email:password - ROKU: email:password - TVNZ: email:password - CBC: email:password - CRAVE: email:password - -# Override default directories used across unshackle -directories: - cache: Cache - cookies: Cookies - dcsl: DCSL # Device Certificate Status List - downloads: Downloads - logs: Logs - temp: Temp - wvds: WVDs - prds: PRDs - # Additional directories that can be configured: - # commands: Commands - #services: - # - ./envied/services/ - vaults: vaults/ - -# fonts: Fonts - -# Pre-define which Widevine or PlayReady device to use for each Service -cdm: - default: device -# itv: DRMLABL3 - -# ========================================== -# REMOTE CDM - not working -# ========================================== - -remote_cdm: - - name: "DRMLABL3" - "Device Type": ANDROID - "Device Name": "l3" - "System ID": 8159 - "Security Level": 3 - "Host": "http://api2.drmlab.io" - "Secret": "drmlab" - -remote_cdm: - - name: "DRMLAB_SL3K" - "Device Type": PLAYREADY - "Device Name": "sl3k" - "System ID": 0 - "Security Level": 3000 - "Host": "http://api2.drmlab.io/playready" - "Secret": "drmlab" - -# Key Vaults store your obtained Content Encryption Keys (CEKs) -key_vaults: -- type: SQLite - name: Local vault - path: key_store.db - -#- type: HTTPAPI -# name: drmlab -# host: http://api.drmlab.io/vault/ -# password: gEX75q7I5YVkvgF5SUkcNd41IbGrDtTT -- type: HTTP - name: DRMLab - host: http://api.drmlab.io/vault/ - password: gEX75q7I5YVkvgF5SUkcNd41IbGrDtTT - api_mode: json - no_push: false - -# Choose what software to use to download data -#downloader: n_m3u8dl_re -# Options: requests | aria2c | curl_impersonate | n_m3u8dl_re -# Can also be a mapping: -downloader: -# NF: requests -# AMZN: n_m3u8dl_re - ALL4: n_m3u8dl_re - BBC: requests - default: n_m3u8dl_re - -# aria2c downloader configuration -aria2c: - max_concurrent_downloads: 4 - max_connection_per_server: 3 - split: 5 - file_allocation: falloc # none | prealloc | falloc | trunc - -# N_m3u8DL-RE downloader configuration -n_m3u8dl_re: - thread_count: 16 - ad_keyword: "advertisement" - use_proxy: true - -# curl_impersonate downloader configuration -curl_impersonate: - browser: chrome120 - -# Pre-define default options and switches of the dl command -dl: - best: true - sub_format: srt - downloads: 4 - workers: 16 - - - -# Chapter Name to use when exporting a Chapter without a Name -chapter_fallback_name: "Chapter {j:02}" - -# Case-Insensitive dictionary of headers for all Services -headers: - Accept-Language: "en-US,en;q=0.8" - User-Agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" - -# Override default filenames used across unshackle -filenames: - log: "envied_{name}_{time}.log" - config: "config.yaml" - root_config: "envied.yaml" - chapters: "Chapters_{title}_{random}.txt" - subtitle: "Subtitle_{id}_{language}.srt" - -# API key for The Movie Database (TMDB) -# tmdb_api_key: key - -# tag_imdb_tmdb (bool) -tag_imdb_tmdb: true - - -# conversion_method: -# - auto (default): Smart routing - subby for WebVTT/SAMI, standard for others -# - subby: Always use subby with advanced processing -# - pycaption: Use only pycaption library (no SubtitleEdit, no subby) -# - subtitleedit: Prefer SubtitleEdit when available, fall back to pycaption -subtitle: - conversion_method: auto - sdh_method: auto - - -# Configuration data for each Service -services: - # Service-specific configuration goes here - # EXAMPLE: - # api_key: "service_specific_key" - -# Legacy NordVPN configuration (use proxy_providers instead) -#proxy_providers: -# nordvpn: -# username: gobbldegook -# password: twaddle -# server_map: -# us: 6918 -# uk: 2613 -# nz: 100