[Attachment 93853 - Click to enlarge]
The highlighted part of the image shows what variables you can choose - in any order - to make a file name.
The output_template contains the current chosen variables for movies, series and songs. You just change the output_template to match your preference by selecting the variables you want, in the order you want them in. Some variables like 'year' from some providers, may not always have a value given. To stop that breaking the script a '?' is added to the variable. In this case {year?}: meaning if the year has a value print it otherwise miss it out. The variables are held inside curly-braces. If you put a space or a character between the braces, it will be printed too. Currently curly-braces have a space you seem to want a full stop, so...
... can you manage to put together something like
??Code:output_template movies: ...... series: '{title}.{season_episode}.{episode_name?}.{resolution}' and keep adding what you need inside curly-braces
The page I referred you too had this:-
[Attachment 93854 - Click to enlarge]
Which looks pretty much the solution you are looking for but with ressolution missing.
+ Reply to Thread
Results 1,231 to 1,260 of 1351
-
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thanks again for the help A_n_g_e_l_a
here is part of my yamlI have uncommented this section to try and give me scene namingCode:# Custom output templates for filenames # Configure output_template in your envied.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})' 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}' # # Folder naming (optional). One template for all, or a per-kind map. # Valid kinds: movies, series, songs, albums (album vars: see docs). # folder: '{title} ({year?})' folder: movies: '{title} ({year})' series: '{title} ({year?})'then started downloading a series and it gives me a folder and file with standard naming - Vinnie Jones In the Country\Vinnie Jones In the Country S01E01 Keep Swinging.mkvCode:series: '{title}.{year?}.{season_episode}.{episode_name?}.{repack?}.{edition?}.{quality}.{source}.WEB-DL.{dual?}.{multi?}.{audio_full}.{atmos?}.{hdr?}.{hfr?}.{video}-{tag}'
I definitely must have something wrong in my yaml
Thank you again for the help. -
Yes. You do.
-
Think like a computer: it reads line by line. Only when it sees a # at the line start, it knows to ignore the line and just move on. Those lines are comments for humans; we say the the line is commented-out (with the hash key #). We also talk of uncommenting lines by removing the hash symbol (#)
This is a section of your yaml
output_template:
# Scene-style naming (dot-separated)
#movies: '{title}.{year}.{repack?}.{edition?}.{quality}.{so urce}.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?}.{sour ce?}.WEB-DL.{audio_full}.{atmos?}-{tag}'
#
# Plex-friendly naming (space-separated, clean format)
movies: '{title} ({year})'
*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}'
#
# Folder naming (optional). One template for all, or a per-kind map.
# Valid kinds: movies, series, songs, albums (album vars: see docs).
# folder: '{title} ({year?})'
folder:
movies: '{title} ({year})'
series: '{title} ({year?})'
The computer reads in output_template. Next it finds an uncommented line starting 'series' which it reads and understands - its the line that sets scene naming that you want.
It continues and reads lines starting movies and sees you want title and year. So far so good.
Next it reads series, (again??) and sees you are now telling it to make series '{title} {season_episode} {episode_name?}' which it does.
Do you now have enough information to correct your code? # is the clue.
I've marked a red asterisk where you define series twice. Your computer is only doing as its told.Last edited by A_n_g_e_l_a; 21st Sep 2026 at 09:09.
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Having an issue with TUBI today all the VPN for U.S. for Windscribe are resulting in " - Failed to obtain video resources. Check geography settings.
Title is available in: United States". Hopefully I find one that works. I will check with Twinvine Envied.
It is working fine with Twinvine Envied.
I ran across some failures with 403 unauthorized when it comes to Tubi.Last edited by Tom Saurus; 22nd Sep 2026 at 17:11.
-
Hi there, I've been trying to work out this error with envied dscp service, I ran the script through claude and it says it fixed some errors but when I ran it, it said the changes needed to be pushed, this was my error.
Thank you for the help as always, do these services get maintained now?Code:(TwinVine) C:\Users\Test\TwinVine\.venv\Scripts>uv run envied dl -v h.265 -q 1080 -ns -w s01 dscp https://play.discoveryplus.com/show/3f7f2ee3-1478-4dd4-927a-a04be06623b0 ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.4.0 - https://github.com/vinefeeder/envied Loaded 68 services Service Config loaded Loaded 2/2 Vaults Loaded PlayReady CDM: Sharp AQUOS LCD TV 4T-CXXFXX (L3000) ────────────────────────────── Service: DSCP ─────────────────────────────── Service has no Geofence + Using cached Tokens... Authenticated with Service ────────────── Series: James May's Shed Load Of Ideas (2025) ─────────────── 1 season, S1(8) ──────── James May's Shed Load Of Ideas 2025 S01E01 Traffic Wardens ──────── C:\Users\Test\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vinefe eder__twinvine-services\DSCP\__init__.py:380: FutureWarning: Truth-testing of elements was a source of confusion and will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. template = rep.find("SegmentTemplate") or adapt_set.find("SegmentTemplate") Skipped subtitles as --no-subs was used... Original language not available for title, skipping 'orig' selection for video There's no orig Video Track... (TwinVine) C:\Users\Test\TwinVine\.venv\Scripts>
edit, I've managed to fix the error by using -l enLast edited by kev043; 23rd Sep 2026 at 06:59.
-
Kev, read the error message! It's there to help you.
It would appear if you don't say what language to download, and the service doesn't use 'orig', it will bale out. This is all new to me, never used DSCP.
So try specifying --lang en as a parameter or maybe --lang en-us.
EDIT: Found an online correction file for DSCP. Now posted to repo on git.gay/vinefeeder. It should load for next use; if not delete the folder - packages/envied/src/envied/services/_repo and re-run envied.Last edited by A_n_g_e_l_a; 23rd Sep 2026 at 08:13. Reason: EDIT
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thank you for the update on dcsp A_n_g_e_l_a I will update and give it a test later, are there any script updates for hmax as everything works fine except there is an error downloading sport content.
I really appreciate the help thank you. -
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Anyone running into an error with Vinefeeder and DSCP, edit the services/_repos/git.gay.../DSCP/__init__.py
Change:
from unshackle.core.utilities import is_close_match
to:
from envied.core.utilities import is_close_match -
-
Pushed a fix for import errors DSCP and fixed a number of other import errors arising from the update to v5.5.0. Additionally pushed corrections to twinvine-services on git.gay.
[Attachment 93879 - Click to enlarge]Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
hi, i just pulled the latest update but get these errors
[Attachment 93881 - Click to enlarge] -
That has been sorted.
You probably have the old service files in packages/envied/src/envied/services/_repos.
Delete your existing _repos folder to stop old service code being used.
I have had to change some imports in all those services giving errors.
We have been in a bit of a no-man's-land, 5.4 downloaded and stored services permanently while 5.5.0 now has them as volatile downloads.Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thank you for the update on the services A_n_g_e_l_a
I know you don't deal with services on here, but should I change this to envied.core? thanks
Code:import click from click import Context from langcodes import Language from lxml import etree from unshackle.core.credential import Credential from unshackle.core.manifests import DASH from unshackle.core.search_result import SearchResult from unshackle.core.service import Service from unshackle.core.session import session as CurlSession from unshackle.core.titles import Episode, Movie, Movies, Series from unshackle.core.tracks import Audio, Chapter, Chapters, Subtitle, Track, Tracks from envied.core.utilities import is_close_match
-
thanks for this. is there a problem with roku? or is it my setup. i get the following errors now:
PS C:\Multimedia\Video\video-tools\TwinVine> uv run envied dl roku https://therokuchannel.roku.com/watch/ae962efa0d2550fbb02a30ec46e1d3a0
░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄
░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█
░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░
...more than unshackled...
v 5.5.0 - https://github.com/vinefeeder/envied
Loaded 69 services
Service Config loaded
Loaded 2/2 Vaults
Loaded Widevine CDM: 4445 (L3)
────────────────────────────── Service: ROKU ───────────────────────────────
Service is not Geoblocked in your region
Authenticated with Service
──────────────────── Series: Hanging by a Thread (2005) ────────────────────
1 season, S3(1)
───────────────────── Hanging by a Thread 2005 S03E01 ──────────────────────
╭───────────────────── Traceback (most recent call last) ──────────────────────╮
│ in _run_module_as_main:198 │
│ in _run_code:88 │
│ │
│ in <module>:10 │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\rich_click\ │
│ rich_command.py:402 in __call__ │
│ │
│ 399 │ │ # Include this here because I run into a false warning │
│ 400 │ │ # in the PyCharm IDE otherwise; for some reason PyCharm doesn' │
│ 401 │ │ # seem to think RichGroups are callable. (No issues with Mypy, │
│ ❱ 402 │ │ return super().__call__(*args, **kwargs) │
│ 403 │ │
│ 404 │ @overload │
│ 405 │ def command(self, __func: Callable[..., Any]) -> RichCommand: ... │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\click\core. │
│ py:1462 in __call__ │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\rich_click\ │
│ rich_command.py:216 in main │
│ │
│ 213 │ │ try: │
│ 214 │ │ │ try: │
│ 215 │ │ │ │ with self.make_context(prog_name, args, **extra) as ct │
│ ❱ 216 │ │ │ │ │ rv = self.invoke(ctx) │
│ 217 │ │ │ │ │ if not standalone_mode: │
│ 218 │ │ │ │ │ │ return rv │
│ 219 │ │ │ │ │ # it's not safe to `ctx.exit(rv)` here! │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\click\core. │
│ py:1850 in invoke │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\click\core. │
│ py:1850 in invoke │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\click\core. │
│ py:1819 in _process_result │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\click\core. │
│ py:814 in invoke │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\packages\envied\src\envied\core\tem │
│ p.py:77 in wrapper │
│ │
│ 74 │ @functools.wraps(fn) │
│ 75 │ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: │
│ 76 │ │ with task_temp_dir(): │
│ ❱ 77 │ │ │ return fn(*args, **kwargs) │
│ 78 │ │
│ 79 │ return wrapper │
│ 80 │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\packages\envied\src\envied\commands │
│ \dl.py:2146 in result │
│ │
│ 2143 │ │ │ tracks_label = "Getting Remote Tracks..." if self.is_remo │
│ 2144 │ │ │ with console.status(tracks_label, spinner="dots"): │
│ 2145 │ │ │ │ try: │
│ ❱ 2146 │ │ │ │ │ title.tracks.add(service.get_tracks(title), warn_ │
│ 2147 │ │ │ │ │ title.tracks.chapters = service.get_chapters(titl │
│ 2148 │ │ │ │ except Exception as e: │
│ 2149 │ │ │ │ │ if self.debug_logger: │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\packages\envied\src\envied\services │
│ \_repos\git.gay__vinefeeder__twinvine-services\ROKU\__init__.py:184 in │
│ get_tracks │
│ │
│ 181 │ │ │ headers=headers, │
│ 182 │ │ │ json=payload, │
│ 183 │ │ ) │
│ ❱ 184 │ │ r.raise_for_status() │
│ 185 │ │ │
│ 186 │ │ videos = r.json()["playbackMedia"]["videos"] │
│ 187 │ │ self.license = next( │
│ │
│ C:\Multimedia\Video\video-tools\TwinVine\.venv\Lib\site-packages\requests\mo │
│ dels.py:1026 in raise_for_status │
│ │
│ 1023 │ │ │ ) │
│ 1024 │ │ │
│ 1025 │ │ if http_error_msg: │
│ ❱ 1026 │ │ │ raise HTTPError(http_error_msg, response=self) │
│ 1027 │ │
│ 1028 │ def close(self): │
│ 1029 │ │ """Releases the connection back to the pool. Once this method │
╰───────────────────────────────────────────────── ─────────────────────────────╯
HTTPError: 451 Client Error: Unknown for url:
https://therokuchannel.roku.com/api/v3/playback
PS C:\Multimedia\Video\video-tools\TwinVine> -
Do you need too? I have shims installed so that some unshackle imports get redirected to envied. As strange as it seems the above should still work. At least it all parsed correctly when I ran
uv run envied dl -?
as a test.
I have reconciled all the imports for DSCP at source. git.gay/vinefeeder/twinvine-services/Last edited by A_n_g_e_l_a; 24th Sep 2026 at 08:23.
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thank you for the update to the services A_n_g_e_l_a I've installed the updated ones, it's strange as dscp was working fine yesterday, I still have a backup of the working one, I was getting this error on a dscp series.
I can't thank you enough, I'm trying my hardest to fix the errors myself and learn, you have a great knowledge thank you.Code:(TwinVine) C:\Users\Kev\TwinVine\.venv\Scripts>uv run envied dl -v h.265 -q 1080 -ns -w s05 dscp https://play.discoveryplus.com/show/52b11615-79e2-48f0-9332-5800cd3450a4 ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.4.0 - https://github.com/vinefeeder/envied Loaded 69 services Service Config loaded Loaded 2/2 Vaults Loaded PlayReady CDM: Sharp AQUOS LCD TV 4T-CXXFXX (L3000) ────────────────────────────── Service: DSCP ─────────────────────────────── Service has no Geofence + Using cached Tokens... Authenticated with Service ──────────────────────── Series: Man v. Food (2017) ──────────────────────── 7 seasons, S1(10), S2(14), S3(14), S4(20), S5(12), S6(10), S7(10) ─────────────── Man v. Food 2020 S05E01 Mystic, Connecticut ──────────────── ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ in _run_module_as_main:203 │ │ in _run_code:88 │ │ │ │ in <module>:10 │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\rich_click\rich_command.py:402 │ │ in __call__ │ │ │ │ 399 │ │ # Include this here because I run into a false warning │ │ 400 │ │ # in the PyCharm IDE otherwise; for some reason PyCharm doesn' │ │ 401 │ │ # seem to think RichGroups are callable. (No issues with Mypy, │ │ ❱ 402 │ │ return super().__call__(*args, **kwargs) │ │ 403 │ │ │ 404 │ @overload │ │ 405 │ def command(self, __func: Callable[..., Any]) -> RichCommand: ... │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1462 in __call__ │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\rich_click\rich_command.py:216 │ │ in main │ │ │ │ 213 │ │ try: │ │ 214 │ │ │ try: │ │ 215 │ │ │ │ with self.make_context(prog_name, args, **extra) as ct │ │ ❱ 216 │ │ │ │ │ rv = self.invoke(ctx) │ │ 217 │ │ │ │ │ if not standalone_mode: │ │ 218 │ │ │ │ │ │ return rv │ │ 219 │ │ │ │ │ # it's not safe to `ctx.exit(rv)` here! │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1819 in │ │ _process_result │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:814 in invoke │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\core\temp.py:77 in wrapper │ │ │ │ 74 │ @functools.wraps(fn) │ │ 75 │ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: │ │ 76 │ │ with task_temp_dir(): │ │ ❱ 77 │ │ │ return fn(*args, **kwargs) │ │ 78 │ │ │ 79 │ return wrapper │ │ 80 │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\commands\dl.py:2473 in │ │ result │ │ │ │ 2470 │ │ │ tracks_label = "Getting Remote Tracks..." if self.is_remo │ │ 2471 │ │ │ with console.status(tracks_label, spinner="dots"): │ │ 2472 │ │ │ │ try: │ │ ❱ 2473 │ │ │ │ │ title.tracks.add(service.get_tracks(title), warn_ │ │ 2474 │ │ │ │ │ title.tracks.chapters = service.get_chapters(titl │ │ 2475 │ │ │ │ except Exception as e: │ │ 2476 │ │ │ │ │ if self.debug_logger: │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vi │ │ nefeeder__twinvine-services\DSCP\__init__.py:309 in get_tracks │ │ │ │ 306 │ │ │ if isinstance(track, Subtitle): │ │ 307 │ │ │ │ tracks.subtitles.remove(track) │ │ 308 │ │ │ │ ❱ 309 │ │ subtitles = self._process_subtitles(dash, original_language, s │ │ 310 │ │ tracks.add(subtitles) │ │ 311 │ │ │ │ 312 │ │ return tracks │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vi │ │ nefeeder__twinvine-services\DSCP\__init__.py:440 in _process_subtitles │ │ │ │ 437 │ │ │ track_name = "Original" if (language and is_close_match(la │ │ 438 │ │ │ │ │ 439 │ │ │ final_tracks.append( │ │ ❱ 440 │ │ │ │ Subtitle( │ │ 441 │ │ │ │ │ id_=track_id, │ │ 442 │ │ │ │ │ url=dash.url, │ │ 443 │ │ │ │ │ codec=Subtitle.Codec.WebVTT, │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\core\tracks\subtitle.py:172 │ │ in __init__ │ │ │ │ 169 │ │ │ More in-depth information, examples, and stuff to look fo │ │ 170 │ │ │ explanation list above. │ │ 171 │ │ """ │ │ ❱ 172 │ │ super().__init__(*args, **kwargs) │ │ 173 │ │ │ │ 174 │ │ if not isinstance(codec, (Subtitle.Codec, type(None))): │ │ 175 │ │ │ raise TypeError(f"Expected codec to be a {Subtitle.Codec} │ ╰──────────────────────────────────────────────────────────────────────────────╯ TypeError: Track.__init__() got an unexpected keyword argument 'service' -
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Using remote repos means they do not get downloaded until envied is run.
If you, like me, start with vinefeeder, on the very first run it will complain
[Attachment 93882 - Click to enlarge]
if you run uv run envied dl -? all the services will be loaded and vinefeeder will be happy!
It is not ideal; maybe we should go back to fixed services?Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
I am getting this a lot with Tubi. Any advice is appreciated and thank you in advance:
Code:C:\TwinVine>uv run envied dl -q 422 TUBI https://tubitv.com/movies/100005833/jackie-chan-s-first-strike ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.5.0 - https://github.com/vinefeeder/envied Loaded 69 services Service Config loaded Loaded 2/2 Vaults Loaded Widevine CDM: 4445 (L3) ────────────────────────────── Service: TUBI ─────────────────────────────── Service has no region restrictions Authenticated with Service ──────────────── Movies: Jackie Chan's First Strike (1996) ───────────────── 1 Movie ──────────────────── Jackie Chan's First Strike (1996) ───────────────────── 1 Video └── [H.264, SDR] | en | 1024x422 @ 2182 kb/s, 23.976 FPS ⠦ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • --:-- • FAILED 1 Audio └── [AAC] | en | 2.0 | 135 kb/s ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • 00:01 • SKIPPED 1 Subtitle └── [SRT] | en ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • 00:01 • SKIPPED 2 Chapters ├── 00:00:00.000 └── 01:19:36.000 | End Credits Widevine(AAAAOHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABgSEPdn8ZHABUXcv...) └── An exception occurred in the Service's license function: Unauthorized. Error code: 403 ❌ Download Failed... ConnectionError: Unauthorized. Error code: 403 An unexpected error occurred in one of the download workers. ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:2982 in result │ │ │ │ 2979 │ │ │ │ │ │ │ 2980 │ │ │ │ │ skipped_before = len(self.skipped_subtitles) │ │ 2981 │ │ │ │ │ grow_session_pool(service.session, downloads * (w │ │ ❱ 2982 │ │ │ │ │ download_tracks_in_passes( │ │ 2983 │ │ │ │ │ │ title.tracks, │ │ 2984 │ │ │ │ │ │ downloads, │ │ 2985 │ │ │ │ │ │ download_track, │ │ │ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:304 in │ │ download_tracks_in_passes │ │ │ │ 301 │ │ with ThreadPoolExecutor(max_concurrent) as pool: │ │ 302 │ │ │ future_to_track = {pool.submit(run_one, track, i): track │ │ 303 │ │ │ for download in futures.as_completed(future_to_track): │ │ ❱ 304 │ │ │ │ download.result() # a video/audio failure is fatal │ │ 305 │ │ │ │ 306 │ │ for i, track in skippable: │ │ 307 │ │ │ DOWNLOAD_CANCELLED.clear() │ │ │ │ C:\Users\sheld\AppData\Roaming\uv\python\cpython-3.14.2-windows-x86_64-none\ │ │ Lib\concurrent\futures\_base.py:443 in result │ │ │ │ 440 │ │ │ │ if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: │ │ 441 │ │ │ │ │ raise CancelledError() │ │ 442 │ │ │ │ elif self._state == FINISHED: │ │ ❱ 443 │ │ │ │ │ return self.__get_result() │ │ 444 │ │ │ │ │ │ 445 │ │ │ │ self._condition.wait(timeout) │ │ 446 │ │ │ │ C:\Users\sheld\AppData\Roaming\uv\python\cpython-3.14.2-windows-x86_64-none\ │ │ Lib\concurrent\futures\_base.py:395 in __get_result │ │ │ │ 392 │ def __get_result(self): │ │ 393 │ │ if self._exception is not None: │ │ 394 │ │ │ try: │ │ ❱ 395 │ │ │ │ raise self._exception │ │ 396 │ │ │ finally: │ │ 397 │ │ │ │ # Break a reference cycle with the exception in self._ │ │ 398 │ │ │ │ self = None │ │ │ │ C:\Users\sheld\AppData\Roaming\uv\python\cpython-3.14.2-windows-x86_64-none\ │ │ Lib\concurrent\futures\thread.py:86 in run │ │ │ │ 83 │ │ │ return │ │ 84 │ │ │ │ 85 │ │ try: │ │ ❱ 86 │ │ │ result = ctx.run(self.task) │ │ 87 │ │ except BaseException as exc: │ │ 88 │ │ │ self.future.set_exception(exc) │ │ 89 │ │ │ # Break a reference cycle with the exception 'exc' │ │ │ │ C:\Users\sheld\AppData\Roaming\uv\python\cpython-3.14.2-windows-x86_64-none\ │ │ Lib\concurrent\futures\thread.py:73 in run │ │ │ │ 70 │ │ │ 71 │ def run(self, task): │ │ 72 │ │ fn, args, kwargs = task │ │ ❱ 73 │ │ return fn(*args, **kwargs) │ │ 74 │ │ 75 │ │ 76 class _WorkItem: │ │ │ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:2954 in download_track │ │ │ │ 2951 │ │ │ │ with SyncLive(Padding(download_table, (1, 5)), consol │ │ 2952 │ │ │ │ │ │ │ 2953 │ │ │ │ │ def download_track(track: AnyTrack, i: int) -> No │ │ ❱ 2954 │ │ │ │ │ │ track.download( │ │ 2955 │ │ │ │ │ │ │ session=track.session or service.session, │ │ 2956 │ │ │ │ │ │ │ no_proxy_download=no_proxy_download, │ │ 2957 │ │ │ │ │ │ │ proxy_download=proxy_download, │ │ │ │ C:\TwinVine\packages\envied\src\envied\core\tracks\track.py:665 in download │ │ │ │ 662 │ │ │ │ │ license_widevine=prepare_drm, │ │ 663 │ │ │ │ │ cdm=cdm, │ │ 664 │ │ │ │ ) │ │ ❱ 665 │ │ │ │ manifest_parsers[self.descriptor].download_track(trac │ │ 666 │ │ │ elif self.descriptor == self.Descriptor.URL: │ │ 667 │ │ │ │ try: │ │ 668 │ │ │ │ │ if not self.drm and track_type in ("Video", "Audi │ │ │ │ C:\TwinVine\packages\envied\src\envied\core\manifests\dash.py:509 in │ │ download_track │ │ │ │ 506 │ │ │ │ │ if not license_widevine: │ │ 507 │ │ │ │ │ │ raise ValueError("license_widevine func must │ │ 508 │ │ │ │ │ progress(downloaded="LICENSING") │ │ ❱ 509 │ │ │ │ │ license_widevine(drm, track_kid=track_kid) │ │ 510 │ │ │ │ │ progress(downloaded="[yellow]LICENSED") │ │ 511 │ │ │ │ except Exception: # noqa │ │ 512 │ │ │ │ │ DOWNLOAD_CANCELLED.set() # skip pending track do │ │ │ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:4552 in prepare_drm │ │ │ │ 4549 │ │ │ │ │ │ │ │ │ context={"track": str(track), "ex │ │ 4550 │ │ │ │ │ │ │ │ ) │ │ 4551 │ │ │ │ │ │ │ self.flush_vault_writes(pending_vault_wri │ │ ❱ 4552 │ │ │ │ │ │ │ raise e │ │ 4553 │ │ │ │ │ │ │ 4554 │ │ │ │ │ log_event( │ │ 4555 │ │ │ │ │ │ "license_keys_retrieved", │ │ │ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:4532 in prepare_drm │ │ │ │ 4529 │ │ │ │ │ ) │ │ 4530 │ │ │ │ │ │ │ 4531 │ │ │ │ │ try: │ │ ❱ 4532 │ │ │ │ │ │ drm.get_content_keys(cdm=track_cdm, licence=l │ │ 4533 │ │ │ │ │ except Exception as e: │ │ 4534 │ │ │ │ │ │ if drm.content_keys: │ │ 4535 │ │ │ │ │ │ │ self.log.debug(f"License call failed but │ │ │ │ C:\TwinVine\packages\envied\src\envied\core\drm\widevine.py:238 in │ │ get_content_keys │ │ │ │ 235 │ │ │ │ │ │ kid_count=len(self.kids), │ │ 236 │ │ │ │ │ ) │ │ 237 │ │ │ │ │ try: │ │ ❱ 238 │ │ │ │ │ │ license_res = licence(challenge=challenge, pss │ │ 239 │ │ │ │ │ except TypeError: │ │ 240 │ │ │ │ │ │ license_res = licence(challenge=challenge) │ │ 241 │ │ │ │ │ cdm.parse_license(session_id, license_res) │ │ │ │ C:\TwinVine\packages\envied\src\envied\commands\dl.py:4249 in │ │ service_licence │ │ │ │ 4246 │ │ if drm_system is None: │ │ 4247 │ │ │ drm_system = "playready" if is_playready_cdm(self.cdm) el │ │ 4248 │ │ fn = service.get_playready_license if drm_system == "playread │ │ ❱ 4249 │ │ return fn(**declared_kwargs(fn, kwargs)) │ │ 4250 │ │ │ 4251 │ def prepare_drm( │ │ 4252 │ │ self, │ │ │ │ C:\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vinefeeder__ │ │ twinvine-services\TUBI\__init__.py:275 in get_widevine_license │ │ │ │ 272 │ │ │ │ 273 │ │ r = self.session.post(url=license_url, data=challenge) │ │ 274 │ │ if r.status_code != 200: │ │ ❱ 275 │ │ │ raise ConnectionError(r.text) │ │ 276 │ │ │ │ 277 │ │ return r.content │ │ 278 │ ╰──────────────────────────────────────────────────────────────────────────────╯ ConnectionError: Unauthorized. Error code: 403 C:\TwinVine> -
I tested with Pluto and had success so my .wvd is working for it and it seems happy with the VPN. I like Tubi quite a bit so I hope whatever the problem is I am having I can remedy it.
Now onto another thing I would like some advice on:
Code:C:\TwinVine>uv run envied dl --list CWTV https://www.cwtv.com/series/wild-cards/?viewContext=Home+Swimlane ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.5.0 - https://github.com/vinefeeder/envied Loaded 69 services Service Config loaded Loaded 2/2 Vaults Loaded Widevine CDM: 4445 (L3) ────────────────────────────── Service: CWTV ─────────────────────────────── Service is not Geoblocked in your region ──────────────────────── Series: Wild Cards (2024) ───────────────────────── 3 seasons, S1(10), S2(13), S3(10) ──────────────── Wild Cards 2024 S01E01 The Infinity Thief ───────────────── Search -> No match found ┌───────────────────────── Available Tracks ─────────────────────────┐ │ 5 Videos │ │ ├── [H.264, SDR] | en | 1920x1080 @ 3557 kb/s, 29.970 FPS │ │ ├── [H.264, SDR] | en | 1280x720 @ 1693 kb/s, 29.970 FPS │ │ ├── [H.264, SDR] | en | 960x540 @ 1020 kb/s, 29.970 FPS │ │ ├── [H.264, SDR] | en | 640x360 @ 486 kb/s, 29.970 FPS │ │ └── [H.264, SDR] | en | 384x216 @ 240 kb/s, 29.970 FPS │ │ 4 Audio │ │ ├── [AAC] | en | 192 kb/s │ │ ├── [AAC] | en | 125 kb/s │ │ ├── [AAC] | en | 93 kb/s │ │ └── [AAC] | en | 61 kb/s │ │ 1 Subtitle │ │ └── [VTT] | en │ │ 6 Chapters │ │ ├── 00:00:00.000 │ │ ├── 00:00:01.646 │ │ ├── 00:10:58.333 │ │ ├── 00:19:49.834 │ │ ├── 00:31:55.266 │ │ └── 00:35:36.333 │ └────────────────────────────────────────────────────────────────────┘I just consulted envied usage and found the solution but others can learn along with me:Code:C:\TwinVine>uv run envied dl -q 720 -w S01E01 CWTV https://www.cwtv.com/series/wild-cards/?viewContext=Home+Swimlane ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.5.0 - https://github.com/vinefeeder/envied Loaded 69 services Service Config loaded Loaded 2/2 Vaults Loaded Widevine CDM: 4445 (L3) ────────────────────────────── Service: CWTV ─────────────────────────────── Service is not Geoblocked in your region ──────────────────────── Series: Wild Cards (2024) ───────────────────────── 3 seasons, S1(10), S2(13), S3(10) ──────────────── Wild Cards 2024 S01E01 The Infinity Thief ───────────────── Original language not available for title, skipping 'orig' selection for video There's no orig Video Track...
uv run envied dl -q 720 --lang eng -w S01E01 CWTV https://www.cwtv.com/series/wild-cards/?viewContext=Home+Swimlane -
I've updated to the latest version of twinvine and services ran a series download for dscp and got this error.
Thank you once again for the help.Code:(TwinVine) C:\Users\Kev\TwinVine\.venv\Scripts>uv run envied dl -v h.265 -q 1080 -ns -w s05 dscp https://play.discoveryplus.com/show/52b11615-79e2-48f0-9332-5800cd3450a4 ░█▀▀░█▀█░█░█░▀█▀░█▀▀░█▀▄ ░█▀▀░█░█░▀▄▀░░█░░█▀▀░█░█ ░▀▀▀░▀░▀░░▀░░▀▀▀░▀▀▀░▀▀░ ...more than unshackled... v 5.5.0 - https://github.com/vinefeeder/envied Loaded 69 services Service Config loaded Loaded 2/2 Vaults Loaded PlayReady CDM: Sharp AQUOS LCD TV 4T-CXXFXX (L3000) ────────────────────────────── Service: DSCP ─────────────────────────────── Service has no region restrictions + Setting up new profile... Authenticated with Service ──────────────────────── Series: Man v. Food (2017) ──────────────────────── 7 seasons, S1(10), S2(14), S3(14), S4(20), S5(12), S6(10), S7(10) ─────────────── Man v. Food 2020 S05E01 Mystic, Connecticut ──────────────── ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ in _run_module_as_main:203 │ │ in _run_code:88 │ │ │ │ in <module>:10 │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\rich_click\rich_command.py:402 │ │ in __call__ │ │ │ │ 399 │ │ # Include this here because I run into a false warning │ │ 400 │ │ # in the PyCharm IDE otherwise; for some reason PyCharm doesn' │ │ 401 │ │ # seem to think RichGroups are callable. (No issues with Mypy, │ │ ❱ 402 │ │ return super().__call__(*args, **kwargs) │ │ 403 │ │ │ 404 │ @overload │ │ 405 │ def command(self, __func: Callable[..., Any]) -> RichCommand: ... │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1462 in __call__ │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\rich_click\rich_command.py:216 │ │ in main │ │ │ │ 213 │ │ try: │ │ 214 │ │ │ try: │ │ 215 │ │ │ │ with self.make_context(prog_name, args, **extra) as ct │ │ ❱ 216 │ │ │ │ │ rv = self.invoke(ctx) │ │ 217 │ │ │ │ │ if not standalone_mode: │ │ 218 │ │ │ │ │ │ return rv │ │ 219 │ │ │ │ │ # it's not safe to `ctx.exit(rv)` here! │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1850 in invoke │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:1819 in │ │ _process_result │ │ │ │ C:\Users\Kev\TwinVine\.venv\Lib\site-packages\click\core.py:814 in invoke │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\core\temp.py:77 in wrapper │ │ │ │ 74 │ @functools.wraps(fn) │ │ 75 │ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: │ │ 76 │ │ with task_temp_dir(): │ │ ❱ 77 │ │ │ return fn(*args, **kwargs) │ │ 78 │ │ │ 79 │ return wrapper │ │ 80 │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\commands\dl.py:2146 in │ │ result │ │ │ │ 2143 │ │ │ tracks_label = "Getting Remote Tracks..." if self.is_remo │ │ 2144 │ │ │ with console.status(tracks_label, spinner="dots"): │ │ 2145 │ │ │ │ try: │ │ ❱ 2146 │ │ │ │ │ title.tracks.add(service.get_tracks(title), warn_ │ │ 2147 │ │ │ │ │ title.tracks.chapters = service.get_chapters(titl │ │ 2148 │ │ │ │ except Exception as e: │ │ 2149 │ │ │ │ │ if self.debug_logger: │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vi │ │ nefeeder__twinvine-services\DSCP\__init__.py:309 in get_tracks │ │ │ │ 306 │ │ │ if isinstance(track, Subtitle): │ │ 307 │ │ │ │ tracks.subtitles.remove(track) │ │ 308 │ │ │ │ ❱ 309 │ │ subtitles = self._process_subtitles(dash, original_language, s │ │ 310 │ │ tracks.add(subtitles) │ │ 311 │ │ │ │ 312 │ │ return tracks │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\services\_repos\git.gay__vi │ │ nefeeder__twinvine-services\DSCP\__init__.py:440 in _process_subtitles │ │ │ │ 437 │ │ │ track_name = "Original" if (language and is_close_match(la │ │ 438 │ │ │ │ │ 439 │ │ │ final_tracks.append( │ │ ❱ 440 │ │ │ │ Subtitle( │ │ 441 │ │ │ │ │ id_=track_id, │ │ 442 │ │ │ │ │ url=dash.url, │ │ 443 │ │ │ │ │ codec=Subtitle.Codec.WebVTT, │ │ │ │ C:\Users\Kev\TwinVine\packages\envied\src\envied\core\tracks\subtitle.py:173 │ │ in __init__ │ │ │ │ 170 │ │ │ More in-depth information, examples, and stuff to look fo │ │ 171 │ │ │ explanation list above. │ │ 172 │ │ """ │ │ ❱ 173 │ │ super().__init__(*args, **kwargs) │ │ 174 │ │ │ │ 175 │ │ if not isinstance(codec, (Subtitle.Codec, type(None))): │ │ 176 │ │ │ raise TypeError(f"Expected codec to be a {Subtitle.Codec} │ ╰──────────────────────────────────────────────────────────────────────────────╯ TypeError: Track.__init__() got an unexpected keyword argument 'service' (TwinVine) C:\Users\Kev\TwinVine\.venv\Scripts> -
I found an update to DSCP yesterday and updated the git.gay/vinefeeder/twinvine-services repo; it would appear it doesn't work. I don't do pay services; I can't and won't test it. Its not part of my remit to support service code, you all know that. AI can help you and you should explore ways of helping yourselves.
However, I will say this to you and others who fail to appreciate the power you now have in your hands. Remote services allow you to have many versions of the same service available to you; you can set up a choice of which service loads!!
You can set this up in the envied.yaml; here is part of mine presently:-
[Attachment 93888 - Click to enlarge]
The yaml entries for where to find services are taken in order when envied first runs. I have no services in the link .packages/envied/src/envied/services
but there are some in the second location, a remote one, https://git.gay/stabbedbybrick/unshackle-services.git so they all get loaded.
(Note these are unshackle coded services but with shims they work with envied. I needed to add some more shims this evening for some imports that SBB's services need.)
Then the next remote repo from twinvine-servies gets loaded - again any duplicates for services already loaded are ignored. New services should be added.
And so on until the service list of locations is consumed.
I have updated the envied-working-example.yaml; comment out and change the load order to suit you.
Remember, any remote repos you find may be used, as well as lone services.
If any need a shim not provided, say so here.
What this means is, if you want to use SBB's services in preference to any at twinvine-services you would have SBB's services loaded first.
You have control over which groups of services is loaded from which location. If you ever find a service that replaces one of SBBs's or twinvine-services' you would put in in the local packages/envied/src/envied/services/ folder and make sure that location is first on your list in the yaml.
[Attachment 93889 - Click to enlarge]Last edited by A_n_g_e_l_a; 24th Sep 2026 at 17:59. Reason: added image
Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thank you for the detailed info A_n_g_e_l_a it makes for a good read I appreciate the help
-
And don't forget if you are signed up to sp4rkys discord channel and can get a key you can use his remote services
[Attachment 93895 - Click to enlarge]
...snip....
[Attachment 93896 - Click to enlarge]Noob Starter Pack. Just download any Widevine media! Over 30,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip
Similar Threads
-
Devine - Modular Movie, TV, and Music Archival Software
By billybanana in forum Video Streaming DownloadingReplies: 1871Last Post: 26th Jan 2026, 15:12 -
Bitrate confusion: HD vs. DV archival
By taigi in forum Capturing and VCRReplies: 3Last Post: 9th Nov 2024, 04:38 -
How do I completely remove the music and sound effects from a movie?
By cns00 in forum EditingReplies: 1Last Post: 15th Jan 2024, 13:11 -
Which software can remove music from show but keep character dialogue?
By Mohamed61020 in forum AudioReplies: 6Last Post: 2nd Jul 2023, 22:32 -
Software for simple music videos?
By dewiclements in forum Software PlayingReplies: 3Last Post: 26th Jul 2022, 02:21



Quote