Announcing Envied to the World! Envied is an anagram of Devine and the name pays homage to devine's author.
https://github.com/vinefeeder/envied
The reason for envied's existence is to showcase a --select-titles option as below
[Attachment 88338 - Click to enlarge]
Envied is a fork, of a fork, of Devine
Code:uv run unshackle dl --select-titles ITV https://www.itv.com/watch/the-fortune-hotel/10a5106/
- If you are downloading and only want the pilot - easy;
- if you are downloading and only want the last two episodes - easy;
- if you are downloading episode weekly and cannot remember the last episode number -easy.
The git repository also has services and a remote cdm pre-configured. All you will need to do is copy across your directories list into the unshackle.yaml within the envied/unshackle folder.
Devine worked well for two years nearly without any updates. The current unshackle fork is a good base for a stable release of Envied which will not be updated every other day.
+ Reply to Thread
Results 1 to 12 of 12
-
Last edited by A_n_g_e_l_a; 19th Aug 2025 at 08:17.
Noob Starter Pack. Just download every Widevine mpd! Not kidding!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thanks for this.
How do i specify what the file to be named as for envied and for vinefeeder
it doesnt seem to work if i use what i use in devine.
"C:\Users\winvictim\TwinVine\packages\envied\src\e nvied\envied.yaml"
filenames:
log: "envied_{name}_{time}.log"
config: "config.yaml"
root_config: "envied.yaml"
chapters: "Chapters_{title}_{random}.txt"
subtitle: "Subtitle_{id}_{language}.srt"
series: "{title}.S{season}E{episode}.{name}.{resolution}.{ service}.WEB-DL.{audio}.H.264"
movies: "{title}.{year}.{resolution}.{service}.WEB-DL.{audio}.H.264-SWAN"
filename:
series: "{title}.S{season}E{episode}.{name}.{resolution}.{ service}.WEB-DL.{audio}.H.264"
movies: "{title}.{year}.{resolution}.{service}.WEB-DL.{audio}.H.264-SWAN" -
edit envied.yaml
[Attachment 89599 - Click to enlarge]
Change the current false to true and save. I choose to avoid 'scene naming' as it interferes with series identification in Plex.Noob Starter Pack. Just download every Widevine mpd! Not kidding!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Could you help me to find whats wrong
Trying to download from Youtube
Code:Starting new HTTPS connection (1): manifest.googlevideo.com:443 https://manifest.googlevideo.com:443 "GET /api/manifest/dash/expire/1764837466/ei/-vMwabPyKJOZ-LAPh4eP-Qw/ip/179 .148.162.127/id/67bd0ec6397b81cf/source/youtube/requiressl/yes/xpc/EgV o2aDSNQ%3D%3D/playback_host/rr2---sn-8p8v-bpbk.googlevideo.com/cps/0/m et/1764815866%2C/mh/RL/mm/31%2C29/mn/sn-8p8v-bpbk%2Csn-b8u-bpbl/ms/au% 2Crdu/mv/m/mvi/2/pl/24/rms/au%2Cau/tx/51679579/txs/51679575%2C51679576 %2C51679577%2C51679578%2C51679579/ctier/A/as/fmp4_audio_cenc%2Cfmp4_sd _hd_cenc/pfa/5/gcr/br/initcwndbps/2402500/hightc/yes/siu/1/spc/6b0G_KM 5Pkzoz9zlz-xhoUnFvp8zfuR_XPAjN6BdnG7GSa2PAC1b/vprv/1/rqh/2/mt/17648150 97/fvip/3/keepalive/yes/fexp/51355912%2C51552689%2C51565116%2C51565681 %2C51580968/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl %2Cxpc%2Ctx%2Ctxs%2Cctier%2Cas%2Cpfa%2Cgcr%2Chightc%2Csiu%2Cspc%2Cvprv %2Crqh%2Citag/sig/AJfQdSswRQIhAPK1v4iUnYsIvnEB--012F0iDVNTlsniuPhk2I0D gQ_dAiAXjJ6pmqpqAOoBK6ZyMz8pfzIGIrVxS_83UJU2_0G42A%3D%3D/lsparams/play back_host%2Ccps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinit cwndbps/lsig/APaTxxMwRQIhAJEKzCLiKQQd_7u99mfsUm4fSc8w_JcsRR4inPBdcOPJA iBlmZyBF8ZiCFrJV7dAInUDNP6lNXxQuxtBb8ezfX639A%3D%3D HTTP/1.1" 404 2661 [...] ConnectionError: Failed to request the MPD document. -
From your message I could only figure out
1) we are from the same continent = 179.148.162.127
2) what you are trying to get is not found = HTTP/1.1" 404 2661
https://en.wikipedia.org/wiki/HTTP_404
In other words, you did not provide enough information ... -
Anyone having problems with downloads from CTV?
(freely available titles)
Is there speed throttling in place?
I'm using Devine 3.3.3.
(downloader: n_m3u8dl_re
n_m3u8dl_re:
use_proxy: 'false'
thread_count: 1)
and it takes forever to download, and fails to mux.
Using Envied 2.1.0
(n_m3u8dl_re and aria2c) I would always get an error:
Code:│ 106 │ │ │ │ tokens = res │ │ 107 │ │ │ │ self.log.info(" + Acquired tokens...") │ │ 108 │ │ │ │ │ ❱ 109 │ │ │ cache.set(tokens, expiration=tokens["expires_in"]) │ │ 110 │ │ │ │ │ 111 │ │ │ self.authorization = f"Bearer {tokens['access_token']}" │ │ 112 │ ╰──────────────────────────────────────────────────────────────────────────────╯ KeyError: 'expires_in'
Also, would Envied/Unshackle benefit from option:
Select multiple audios for maximum compatibility with all devices
like the VTCode:-mac, --max-audio-compatability
https://github.com/chu23465/VT-PR?tab=readme-ov-file
to save 2 audio tracks DDP 5.1 and AAC 2.0 for compatibility with CBC/CTV? -
Thank you for your effort. I will send the complete command and the responses.
Code:uv run unshackle --debug dl YTBE Z70Oxjl7gc8 ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ and more than unshackled... v 1.4.8 - https://github.com/vinefeeder/envied Service Config loaded Loaded 0/0 Vaults No vaults are currently active Loaded Widevine CDM: 4445 (L3) ────────────────────────────── Service: YTBE ─────────────────────────────── Starting new HTTPS connection (1): ipinfo.io:443 https://ipinfo.io:443 "GET /json HTTP/1.1" 200 None Service is not Geoblocked in your region Authenticated with Service Cache key mapping: Z70Oxjl7gc8 -> titles_8b1e2300389c93c1_br Cache miss for Z70Oxjl7gc8, fetching fresh data Starting new HTTPS connection (1): www.youtube.com:443 https://www.youtube.com:443 "GET /watch?v=Z70Oxjl7gc8 HTTP/1.1" 200 None https://www.youtube.com:443 "POST /youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 HTTP/1.1" 200 10914 Successfully fetched titles for Z70Oxjl7gc8, updating cache ──────────────────────── Movies: Amigos Alienígenas ──────────────────────── 1 Movie ──────────────────────────── Amigos Alienígenas ──────────────────────────── Starting new HTTPS connection (1): manifest.googlevideo.com:443 https://manifest.googlevideo.com:443 "GET /api/manifest/dash/expire/1764867678/ei/_mkxadXhD6-ZobIP_LDTaQ/ip/179. 148.162.127/id/67bd0ec6397b81cf/source/youtube/requiressl/yes/xpc/EgVo 2aDSNQ%3D%3D/playback_host/rr2---sn-8p8v-bpbk.googlevideo.com/cps/0/me t/1764846078%2C/mh/RL/mm/31%2C29/mn/sn-8p8v-bpbk%2Csn-b8u-bpbl/ms/au%2 Crdu/mv/m/mvi/2/pl/24/rms/au%2Cau/tx/51679579/txs/51679575%2C51679576% 2C51679577%2C51679578%2C51679579/ctier/A/as/fmp4_audio_cenc%2Cfmp4_sd_ hd_cenc/pfa/5/gcr/br/initcwndbps/2363750/hightc/yes/siu/1/spc/6b0G_GN- RFenTlrrkedT8fuwrXHasZecfRl30mwTxJok_4Ya9kQU/vprv/1/rqh/2/mt/176484558 6/fvip/3/keepalive/yes/fexp/51355912%2C51552689%2C51565116%2C51565681% 2C51580968/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl% 2Cxpc%2Ctx%2Ctxs%2Cctier%2Cas%2Cpfa%2Cgcr%2Chightc%2Csiu%2Cspc%2Cvprv% 2Crqh%2Citag/sig/AJfQdSswRgIhAJAzJGsJDCwiPpISGHcxnBA4Bnl4mY_C64El7FISe QLXAiEA-IHrJbzVjDkiObOwwaZJ2Kqejm6-9043uxtUm66b1Pc%3D/lsparams/playbac k_host%2Ccps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwn dbps/lsig/APaTxxMwRQIgC0cf5WlWCf_Q3ZvwkOsHMZTNHQCi204pNCFPgRXjRb8CIQCK murgv7DK5NySMeX_7b3q6hy40c9_bb_ei8HNcc6B0Q%3D%3D HTTP/1.1" 404 2658 ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ in _run_module_as_main:198 │ │ in _run_code:88 │ │ │ │ in <module>:10 │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1442 in __call__ │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1363 in main │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1830 in invoke │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1830 in invoke │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1799 in _process_result │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:794 in invoke │ │ │ │ C:\envied\unshackle\commands\dl.py:667 in result │ │ │ │ 664 │ │ │ │ title.tracks.subtitles = [] │ │ 665 │ │ │ │ │ 666 │ │ │ with console.status("Getting tracks...", spinner="dots"): │ │ ❱ 667 │ │ │ │ title.tracks.add(service.get_tracks(title), warn_only │ │ 668 │ │ │ │ title.tracks.chapters = service.get_chapters(title) │ │ 669 │ │ │ │ │ 670 │ │ │ # strip SDH subs to non-SDH if no equivalent same-lang no │ │ │ │ C:\envied\unshackle\services\YTBE\__init__.py:162 in get_tracks │ │ │ │ 159 │ │ response_data = self.last_response_data │ │ 160 │ │ dashManifestUrl = response_data.get('streamingData', {}).get(' │ │ 161 │ │ │ │ ❱ 162 │ │ return DASH.from_url(dashManifestUrl, session=self.session).to │ │ 163 │ │ │ 164 │ def get_chapters(self, title: Title_T) -> Chapters: │ │ 165 │ │ return [] │ │ │ │ C:\envied\unshackle\core\manifests\dash.py:67 in from_url │ │ │ │ 64 │ │ │ url = res.url │ │ 65 │ │ │ │ 66 │ │ if not res.ok: │ │ ❱ 67 │ │ │ raise requests.ConnectionError("Failed to request the MPD │ │ 68 │ │ │ │ 69 │ │ return DASH.from_text(res.text, url) │ │ 70 │ ╰──────────────────────────────────────────────────────────────────────────────╯ ConnectionError: Failed to request the MPD document. -
Envied is now at version 2.1.0
If you installed viaopen the envied folder in Terminal or powershell and enterCode:git clone https://github.com/vinefeeder/envied.git
to updateCode:git pull
Noob Starter Pack. Just download every Widevine mpd! Not kidding!.
https://files.videohelp.com/u/301890/hellyes6.zip -
I just updated.
A new exception occurred.
Log:Code:uv run unshackle --debug dl YTBE Z70Oxjl7gc8 ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ and more than unshackled... v 2.1.0 - https://github.com/vinefeeder/envied Service Config loaded Loaded 0/0 Vaults No vaults are currently active ────────────────────────────── Service: YTBE ─────────────────────────────── Starting new HTTPS connection (1): ipinfo.io:443 https://ipinfo.io:443 "GET /json HTTP/1.1" 200 None Service is not Geoblocked in your region Authenticated with Service Cache key mapping: Z70Oxjl7gc8 -> titles_8b1e2300389c93c1_br Cache hit for Z70Oxjl7gc8 (hits: 1, misses: 0) ──────────────────────── Movies: Amigos Alienígenas ──────────────────────── 1 Movie ──────────────────────────── Amigos Alienígenas ──────────────────────────── ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ in _run_module_as_main:198 │ │ in _run_code:88 │ │ │ │ in <module>:10 │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1462 in __call__ │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1383 in main │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:1819 in _process_result │ │ │ │ C:\envied\.venv\Lib\site-packages\click\core.py:814 in invoke │ │ │ │ C:\envied\unshackle\commands\dl.py:1034 in result │ │ │ │ 1031 │ │ │ │ │ 1032 │ │ │ with console.status("Getting tracks...", spinner="dots"): │ │ 1033 │ │ │ │ try: │ │ ❱ 1034 │ │ │ │ │ title.tracks.add(service.get_tracks(title), warn_ │ │ 1035 │ │ │ │ │ title.tracks.chapters = service.get_chapters(titl │ │ 1036 │ │ │ │ except Exception as e: │ │ 1037 │ │ │ │ │ if self.debug_logger: │ │ │ │ C:\envied\unshackle\services\YTBE\__init__.py:162 in get_tracks │ │ │ │ 159 │ │ response_data = self.last_response_data │ │ 160 │ │ dashManifestUrl = response_data.get('streamingData', {}).get(' │ │ 161 │ │ │ │ ❱ 162 │ │ return DASH.from_url(dashManifestUrl, session=self.session).to │ │ 163 │ │ │ 164 │ def get_chapters(self, title: Title_T) -> Chapters: │ │ 165 │ │ return [] │ │ │ │ C:\envied\unshackle\core\manifests\dash.py:53 in from_url │ │ │ │ 50 │ @classmethod │ │ 51 │ def from_url(cls, url: str, session: Optional[Union[Session, CurlS │ │ 52 │ │ if not url: │ │ ❱ 53 │ │ │ raise requests.URLRequired("DASH manifest URL must be prov │ │ 54 │ │ if not isinstance(url, str): │ │ 55 │ │ │ raise TypeError(f"Expected url to be a {str}, not {url!r}" │ │ 56 │ ╰──────────────────────────────────────────────────────────────────────────────╯ URLRequired: DASH manifest URL must be provided for relative path computations.
Code:{"timestamp": "2025-12-04T13:41:39.706581+00:00", "session_id": "f0dccc6c", "level": "INFO", "operation": "session_start", "message": "Debug logging session started", "context": {"unshackle_version": "2.1.0", "python_version": "3.12.12 (main, Oct 28 2025, 14:15:42) [MSC v.1944 64 bit (AMD64)]", "platform": "Windows-10-10.0.18363-SP0", "platform_system": "Windows", "platform_release": "10"}} {"timestamp": "2025-12-04T13:41:39.706581+00:00", "session_id": "f0dccc6c", "level": "INFO", "operation": "download_init", "message": "Download command initialized for service YTBE", "service": "YTBE", "context": {"profile": null, "proxy": null, "tag": null, "tmdb_id": null, "tmdb_name": false, "tmdb_year": false, "cli_params": {"quality": [], "vcodec": null, "acodec": null, "vbitrate": null, "abitrate": null, "range_": ["SDR"], "channels": null, "no_atmos": false, "select_titles": false, "wanted": null, "latest_episode": false, "lang": ["orig"], "v_lang": [], "a_lang": [], "s_lang": ["all"], "require_subs": [], "forced_subs": false, "exact_lang": false, "sub_format": null, "video_only": false, "audio_only": false, "subs_only": false, "chapters_only": false, "no_subs": false, "no_audio": false, "no_chapters": false, "no_video": false, "audio_description": false, "slow": false, "list_": false, "list_titles": false, "skip_dl": false, "export": null, "cdm_only": null, "no_proxy": false, "no_folder": false, "no_source": false, "no_mux": false, "workers": null, "downloads": 1, "no_cache": false, "reset_cache": false, "best_available": false}}} {"timestamp": "2025-12-04T13:41:39.718940+00:00", "session_id": "f0dccc6c", "level": "DEBUG", "operation": "load_service_config", "service": "YTBE", "context": {"config_path": "C:\\envied\\unshackle\\services\\YTBE\\config.yaml", "config": {"cookie": "[REDACTED]", "service": "services\\YTBE\\__init__.py"}}} {"timestamp": "2025-12-04T13:41:40.190018+00:00", "session_id": "f0dccc6c", "level": "DEBUG", "operation": "drm_mode_config", "service": "YTBE", "context": {"cdm_only": null, "vaults_only": null, "mode": "Both CDM and Vaults"}} {"timestamp": "2025-12-04T13:41:40.199966+00:00", "session_id": "f0dccc6c", "level": "INFO", "operation": "authenticate", "service": "YTBE", "context": {"has_cookies": true, "has_credentials": false, "profile": null}} {"timestamp": "2025-12-04T13:41:40.233721+00:00", "session_id": "f0dccc6c", "level": "INFO", "operation": "get_titles", "service": "YTBE", "context": {"titles": {"type": "Movies", "count": 1, "title": "Amigos Alien\u00edgenas"}}} {"timestamp": "2025-12-04T13:41:40.311763+00:00", "session_id": "f0dccc6c", "level": "ERROR", "operation": "get_tracks", "message": "Error in get_tracks: DASH manifest URL must be provided for relative path computations.", "service": "YTBE", "context": {"title": "Amigos Alien\u00edgenas"}, "success": false, "error": {"type": "URLRequired", "message": "DASH manifest URL must be provided for relative path computations.", "traceback": ["Traceback (most recent call last):\n", " File \"C:\\envied\\unshackle\\commands\\dl.py\", line 1034, in result\n title.tracks.add(service.get_tracks(title), warn_only=True)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"C:\\envied\\unshackle\\services\\YTBE\\__init__.py\", line 162, in get_tracks\n return DASH.from_url(dashManifestUrl, session=self.session).to_tracks(language=\"en\")\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"C:\\envied\\unshackle\\core\\manifests\\dash.py\", line 53, in from_url\n raise requests.URLRequired(\"DASH manifest URL must be provided for relative path computations.\")\n", "requests.exceptions.URLRequired: DASH manifest URL must be provided for relative path computations.\n"]}} {"timestamp": "2025-12-04T13:41:40.787614+00:00", "session_id": "f0dccc6c", "level": "INFO", "operation": "session_end", "message": "Debug logging session ended"} -
-
I keep getting service is geoblocked for YTBE even though I can watch the video just fine on browser.
[Attachment 90095 - Click to enlarge] -
@Numero @MrArchive221
Here's how it is guys; I find services tucked in various places on the web and port them over to envied. If they work for you - great; if they don't then hard luck... try another approach.
If I use a service and find an error, I will sometimes correct and post it.
If I see an update to an existing service I will collect it and post.
Usually the original authors will make their own corrections, eventually.
And normally it is just a case of waiting ....
It is well to remember service authors may not live in your country. They will have tested the service with endpoints available from where they live, which may, or may not, be the same as those available to you.
There sometime is a note in the service _init__.py that helps you discover where that was, or if there are any restrictions on the service.
(I seem to remember YTBE is/was restricted to Movies)Noob Starter Pack. Just download every Widevine mpd! Not kidding!.
https://files.videohelp.com/u/301890/hellyes6.zip
Similar Threads
-
VirtualDub2 Fork By v0lt
By CarlOtto in forum Video ConversionReplies: 24Last Post: 15th Nov 2025, 08:18 -
Semi-automated guide to install stabbedbybrick's fork of Devine
By SaintyUK in forum Video Streaming DownloadingReplies: 62Last Post: 2nd Sep 2025, 17:03 -
VirtualDub fork and plugins
By shekh in forum EditingReplies: 186Last Post: 28th Sep 2023, 12:39 -
BDSup2Sub++ new fork
By Ennio in forum SubtitleReplies: 0Last Post: 25th May 2022, 04:12 -
MPC-BE fork that doesn't continue to eat CPU/GPU when the thing is paused?
By Asterra in forum Software PlayingReplies: 3Last Post: 21st May 2021, 06:46


Quote
