I've cobbled together some vibecoded slop on this, but one thing I noticed is the general trend of streaming services using local storage in browser vs cookies for auth tokens. Have you happened to find much work around for that?
Looks like iPlayer have also made some changes and now maxes out at 720p again too.
+ Reply to Thread
Results 871 to 900 of 931
-
-
-
Extracting the local storage is just as easy as with cookies, with the main difference being that you generally can't share the session in the same way. If you refresh the auth tokens in a script, the browser session will become invalid and log you out - and vice versa. So if you plan on using a service for both streaming and ripping, the smoothest way is probably to have separate accounts for each. But aside from that, things are pretty similar to when using credentials. Just pull the auth from storage and have the session live and refresh in the script cache instead.
IPlayer is still giving me 1080p and 2160p on the expected titles, so might've just been a hiccup. -
@stabbedbybrick Any chance of a service for crave.ca please? ctv.ca will be shutdown at the end of April.
-
-
Hi Stabby, thanks as always for your help and knowledge, would it be possible to add a HMAX service please? for the moment I'm using the DSCP service with the code changed to work with HMAX as your advice says.
Cheers Stabby, you're a star. -
TVNZ, SBS, and ITV have been updated.
As mentioned earlier, TVNZ auth is a bit different than usual, so PLEASE read the service notes:
A simple extension that will export the local storage: Cookie & Storage Exporter, but any should do the job.Code:unshackle dl TVNZ --help
I also have no ****** idea why Copilot is trying to co-author my commits when I have turned it off everywhere. Goddamn, I hate this dystopian AI nightmare we're living in.
EDIT:
I went ahead and moved the repo to https://git.gay/stabbedbybrick/unshackle-services.
Update your clones/paths accordingly.Last edited by stabbedbybrick; 25th Apr 2026 at 10:19.
-
Thanks stabbedbybrick, all good for both SBS and TVNZ, any chance you can do 9now service?
-
a very odd issue for me on ITV, trying to download tonights episode of Britains Got Talent Season 19 Episode 9 using tonights episode code
ITV https://www.itv.com/watch/britains-got-talent/1a7470/1a7470a0245.
It keeps trying to download the whole season 19,from episode 1 onwards. -
-
This may be a VPN issue I don't know but this is what I get. I think I have the token set up correctly:
[CODE][C:\unshackle>uv run unshackle dl --list-titles TVNZ /tvseries/citadel
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:1485 in __call__ │
│ │
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:1406 in main │
│ │
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:1873 in invoke │
│ │
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:1873 in invoke │
│ │
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:1842 in _process_result │
│ │
│ C:\unshackle\.venv\Lib\site-packages\click\core.py:824 in invoke │
│ │
│ C:\unshackle\unshackle\commands\dl.py:1087 in result │
│ │
│ 1084 │ │ │
│ 1085 │ │ with console.status("Fetching Title Metadata...", spinner="do │
│ 1086 │ │ │ try: │
│ ❱ 1087 │ │ │ │ titles = service.get_titles_cached() │
│ 1088 │ │ │ │ if not titles: │
│ 1089 │ │ │ │ │ self.log.error("No titles returned, nothing to do │
│ 1090 │ │ │ │ │ if self.debug_logger: │
│ │
│ C:\unshackle\unshackle\core\service.py:474 in get_titles_cached │
│ │
│ 471 │ │ account_hash = get_account_hash(self.credential) │
│ 472 │ │ │
│ 473 │ │ # Use title cache to get titles with fallback support │
│ ❱ 474 │ │ return self.title_cache.get_cached_titles( │
│ 475 │ │ │ title_id=str(title_id), │
│ 476 │ │ │ fetch_function=self.get_titles, │
│ 477 │ │ │ region=self.current_region, │
│ │
│ C:\unshackle\unshackle\core\title_cacher.py:119 in get_cached_titles │
│ │
│ 116 │ │ │
│ 117 │ │ try: │
│ 118 │ │ │ # Attempt to fetch fresh titles │
│ ❱ 119 │ │ │ titles = fetch_function() │
│ 120 │ │ │ │
│ 121 │ │ │ if titles: │
│ 122 │ │ │ │ # Successfully fetched, update cache │
│ │
│ C:\unshackle\services\TVNZ\__init__.py:139 in get_titles │
│ │
│ 136 │ def get_titles(self) -> Movies | Series: │
│ 137 │ │ match = re.match(self.TITLE_RE, self.title) │
│ 138 │ │ if not match: │
│ ❱ 139 │ │ │ raise ValueError(f"Invalid title: {self.title}") │
│ 140 │ │ │
│ 141 │ │ content_type, _ = match.groups() │
│ 142 │ │ title_path = urlparse(self.title).path.replace("/player/", "/" │
╰───────────────────────────────────────────────── ─────────────────────────────╯
ValueError: Invalid title: https://www.tvnz.co.nz/tvseries/citadel
C:\unshackle>/CODE]Last edited by Tom Saurus; 26th Apr 2026 at 07:42.
-
Hi everyone, has anyone been able to download with SPOT? In my case, I get the following error:
I:\unshackle-4.0.0>uv run unshackle dl SPOT "https://open.spotify.com/track/1WBOafEFY6UETRWMA1CyqC?si=d0ee7c6fd9084a2a"
▄ ▄▌ ▐ ▄ .▄▄ · ▄ .▄ ▄▄▄· ▄▄· ▄ ▄ ▄▄▌ ▄▄▄ .
█▪██▌█▌▐█▐█ ▀. ██▪▐█▐█ ▀█ ▐█ ▌▪█▌▄▌▪██ ▀▄.▀·
█▌▐█▌▐█▐▐▌▄▀▀▀█▄██▀▐█▄█▀▀█ ██ ▄▄▐▀▀▄·██▪ ▐▀▀▪▄
▐█▄█▌██▐█▌▐█▄▪▐███▌▐▀▐█ ▪▐▌▐███▌▐█.█▌▐█▌▐▌▐█▄▄▌
▀▀▀ ▀▀ █▪ ▀▀▀▀ ▀▀▀ · ▀ ▀ ·▀▀▀ ·▀ ▀.▀▀▀ ▀▀▀
v 4.0.0 - © 2025-2026 - github.com/unshackle-dl/unshackle
Service Config loaded
Loaded 1/1 Vaults
Loaded Widevine CDM: 8159 (L3)
────────────────────────────── Service: SPOT ───────────────────────────────
Service has no Geofence
╭───────────────────── Traceback (most recent call last) ──────────────────────╮
│ in _run_module_as_main:198 │
│ in _run_code:88 │
│ │
│ in <module>:10 │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:1485 in __call__ │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:1406 in main │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:1873 in invoke │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:1873 in invoke │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:1842 in │
│ _process_result │
│ │
│ I:\unshackle-4.0.0\.venv\Lib\site-packages\click\core.py:824 in invoke │
│ │
│ I:\unshackle-4.0.0\unshackle\commands\dl.py:1052 in result │
│ │
│ 1049 │ │ │ try: │
│ 1050 │ │ │ │ cookies = self.get_cookie_jar(self.service, self.prof │
│ 1051 │ │ │ │ credential = self.get_credentials(self.service, self. │
│ ❱ 1052 │ │ │ │ service.authenticate(cookies, credential) │
│ 1053 │ │ │ │ if cookies or credential: │
│ 1054 │ │ │ │ │ self.log.info("Authenticated with Service") │
│ 1055 │ │ │ │ │ if self.debug_logger: │
│ │
│ I:\unshackle-4.0.0\unshackle\services\SPOT\__init__.py:71 in authenticate │
│ │
│ 68 │ │ ) │
│ 69 │ │ self.session.cookies.update(cookies) │
│ 70 │ │ home_page = self.session.get("https://open.spotify.com/").cont │
│ ❱ 71 │ │ token = re.search(r'accessToken":"(.*?)"', home_page).group(1) │
│ 72 │ │ self.is_premium = re.search(r'isPremium"
.*?),', home_page).g │
│ 73 │ │ self.session.headers.update( │
│ 74 │ │ │ { │
│ │
│ C:\Users\Edgar │
│ Lσpez\AppData\Roaming\uv\python\cpython-3.12-windows-x86_64-none\Lib\re\__in │
│ it__.py:177 in search │
│ │
│ 174 def search(pattern, string, flags=0): │
│ 175 │ """Scan through string looking for a match to the pattern, returni │
│ 176 │ a Match object, or None if no match was found.""" │
│ ❱ 177 │ return _compile(pattern, flags).search(string) │
│ 178 │
│ 179 def sub(pattern, repl, string, count=0, flags=0): │
│ 180 │ """Return the string obtained by replacing the leftmost │
╰───────────────────────────────────────────────── ─────────────────────────────╯
TypeError: cannot use a string pattern on a bytes-like object
If anyone could help me with this error, I would be very grateful. A hug from Mιxico. -
@stabbedbybrick I've got the same error as Tom. Can authenticate no problem, just can't find titles. I'm using Surfshark VPN - that works ok to play in browser BTW.
Code:│ D:\Downloads\unshackle\unshackle\core\title_cacher.py:119 in │ │ get_cached_titles │ │ │ │ 116 │ │ │ │ 117 │ │ try: │ │ 118 │ │ │ # Attempt to fetch fresh titles │ │ ❱ 119 │ │ │ titles = fetch_function() │ │ 120 │ │ │ │ │ 121 │ │ │ if titles: │ │ 122 │ │ │ │ # Successfully fetched, update cache │ │ │ │ D:\Downloads\unshackle\unshackle\services\TVNZ\__init__.py:139 in get_titles │ │ │ │ 136 │ def get_titles(self) -> Movies | Series: │ │ 137 │ │ match = re.match(self.TITLE_RE, self.title) │ │ 138 │ │ if not match: │ │ ❱ 139 │ │ │ raise ValueError(f"Invalid title: {self.title}") │ │ 140 │ │ │ │ 141 │ │ content_type, _ = match.groups() │ │ 142 │ │ title_path = urlparse(self.title).path.replace("/player/", "/" │ ╰──────────────────────────────────────────────────────────────────────────────╯ ValueError: Invalid title: https://www.tvnz.co.nz/player/tvepisode/tauranga-hilltop -
-
Ok gotcha. I can confirm these both work.
Code:uv run unshackle dl --proxy NZ -w S10E02 tvnz /tvseries/grand-designs-new-zealand
Will you put out an update in your regex so peeps can use the full url ? I tend to be a full url guy, so i'm really asking for myself. And before I go off to update OzivineCode:uv run unshackle dl --proxy NZ tvnz /player/tvepisode/tauranga-hilltop
Last edited by billybanana; 26th Apr 2026 at 02:00.
-
It's been fixed and should work with all variations now.
Also, if people are having issues with finding an extension for extracting the local storage, you can do it directly from the web developer console as well. Just go to tvnz site, make sure you're logged in and paste this into the console:
It'll save a "local_storage.json" in your download folder that contains the required tokens.Code:Object.assign(document.createElement('a'), { href: URL.createObjectURL(new Blob([JSON.stringify({ accessToken: localStorage.accessToken, refreshToken: localStorage.refreshToken, deviceref: localStorage.deviceref }, null, 2)])), download: 'local_storage.json' }).click(); -
Thank you stabbedbybrick for fixing this issue with TVNZ. I understand if you don't make a CRAVE service. CTV Throwback and such are no longer going to be on CTV.ca starting in May. However CRAVE is a paid service with a potential free tiere so that might break the rules. It would be nice to have a CRAVE service but if we don't get one it is best to focus on what we do have when it comes to services and focus on that.
My advice archive what you want now before the close down date for CTV. -
@stabbedbybrick
Hi mate slight typo on your new git page.
Under Clone repository, it says : It should be:
without the .com -
Hi there people, I had to recently reinstall my pc, I setup unshackle in the usual way paths set, correct app versions but now when I try sport on HMAX I get this error and I'm just trying to figure out what it is as before the reinstall HMAX sport was working fine. thanks as always for the help.
Code:(unshackle) C:\Users\Test\unshackle\.venv\Scripts>unshackle dl HMAX https://play.hbomax.com/sport/5f29d1ef-b069-55b7-8c95-53190d5551ad ▄ ▄▌ ▐ ▄ .▄▄ · ▄ .▄ ▄▄▄· ▄▄· ▄ ▄ ▄▄▌ ▄▄▄ . █▪██▌█▌▐█▐█ ▀. ██▪▐█▐█ ▀█ ▐█ ▌▪█▌▄▌▪██ ▀▄.▀· █▌▐█▌▐█▐▐▌▄▀▀▀█▄██▀▐█▄█▀▀█ ██ ▄▄▐▀▀▄·██▪ ▐▀▀▪▄ ▐█▄█▌██▐█▌▐█▄▪▐███▌▐▀▐█ ▪▐▌▐███▌▐█.█▌▐█▌▐▌▐█▄▄▌ ▀▀▀ ▀▀ █▪ ▀▀▀▀ ▀▀▀ · ▀ ▀ ·▀▀▀ ·▀ ▀.▀▀▀ ▀▀▀ v 4.0.0 - © 2025-2026 - github.com/unshackle-dl/unshackle Service Config loaded Loaded 1/1 Vaults Loaded PlayReady CDM: Qingdao Haier Optronics Co.,Ltd Haier TV Haier TV (L3000) ────────────────────────────── Service: HMAX ─────────────────────────────── Service has no Geofence + Using cached Tokens... Authenticated with Service ───────── Movies: Goodwood Members' Meeting | Day 1 - 2026 (2026) ────────── 1 Movie ───────────── Goodwood Members' Meeting | Day 1 - 2026 (2026) ────────────── Cached 1 Key to 1/1 Vaults Cached 1 Key to 1/1 Vaults 1 Video └── [H.264, SDR] | en | 1920x1080 @ 9429 kb/s, 50.000 FPS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12:16 Downloaded 2 Audio ├── [DD+] | en | 2.0 | 143 kb/s │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 03:37 Downloaded └── [DD+] | fr | 2.0 | 143 kb/s ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 04:57 Downloaded PlayReady(AAAC2HBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAri4AgAAAQABAK4C...) ├── 0100ce87eede00ca46fd71e7fb605227:73be08d27111be823a26fda522072407* └── 01053ad26c9cf4a79246e8cd12789cbe:8f95a7a1e525e607759b0492071d3898* Track downloads finished in 12m17s ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ in _run_module_as_main:198 │ │ in _run_code:88 │ │ │ │ in <module>:10 │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:1485 in │ │ __call__ │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:1406 in main │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:1873 in invoke │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:1873 in invoke │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:1842 in │ │ _process_result │ │ │ │ C:\Users\Test\unshackle\.venv\Lib\site-packages\click\core.py:824 in invoke │ │ │ │ C:\Users\Test\unshackle\unshackle\commands\dl.py:2145 in result │ │ │ │ 2142 │ │ │ │ │ │ │ │ │ │ else title.language or video_ │ │ 2143 │ │ │ │ │ │ │ │ │ ) │ │ 2144 │ │ │ │ │ │ │ │ │ track_id = f"ccextractor-{video_t │ │ ❱ 2145 │ │ │ │ │ │ │ │ │ cc = video_track.ccextractor( │ │ 2146 │ │ │ │ │ │ │ │ │ │ track_id=track_id, │ │ 2147 │ │ │ │ │ │ │ │ │ │ out_path=config.directories.t │ │ 2148 │ │ │ │ │ │ │ │ │ │ / config.filenames.subtitle.f │ │ │ │ C:\Users\Test\unshackle\unshackle\core\tracks\video.py:369 in ccextractor │ │ │ │ 366 │ │ │ │ 367 │ │ # Try on the original file first (preserves container-level CC │ │ 368 │ │ # then fall back to repacked file (ccextractor can fail on som │ │ ❱ 369 │ │ if not _run_ccextractor(): │ │ 370 │ │ │ self.repackage() │ │ 371 │ │ │ _run_ccextractor() │ │ 372 │ │ │ │ C:\Users\Test\unshackle\unshackle\core\tracks\video.py:355 in │ │ _run_ccextractor │ │ │ │ 352 │ │ │ │ 353 │ │ def _run_ccextractor() -> bool: │ │ 354 │ │ │ try: │ │ ❱ 355 │ │ │ │ subprocess.run( │ │ 356 │ │ │ │ │ [binaries.CCExtractor, "-trim", "-nobom", "-noru", │ │ 357 │ │ │ │ │ check=True, │ │ 358 │ │ │ │ │ stdout=subprocess.PIPE, │ │ │ │ C:\Users\Test\AppData\Roaming\uv\python\cpython-3.12-windows-x86_64-none\Lib\ │ │ subprocess.py:571 in run │ │ │ │ 568 │ │ │ raise │ │ 569 │ │ retcode = process.poll() │ │ 570 │ │ if check and retcode: │ │ ❱ 571 │ │ │ raise CalledProcessError(retcode, process.args, │ │ 572 │ │ │ │ │ │ │ │ │ output=stdout, stderr=stderr) │ │ 573 │ return CompletedProcess(process.args, retcode, stdout, stderr) │ │ 574 │ ╰──────────────────────────────────────────────────────────────────────────────╯ CalledProcessError: Command '[WindowsPath('C:/WINDOWS/system32/ccextractor.EXE'), '-trim', '-nobom', '-noru', '-ru1', '-o', WindowsPath('C:/Users/Test/unshackle/Temp/Subtitle_ccextractor-71027c28-0_en.srt' ), WindowsPath('C:/Users/Test/unshackle/Temp/Video_71027c28.mp4')]' returned non-zero exit status 3221225477. -
-
I would assume so as no-one is publishing services for paywall sites on this website as it's against the rules.
If you live in Canada, as you do, you get to sign in with your TV provider details, which I assume is something you pay for. So for non-CA peeps, we can only get free shows from CTV.CA. Same as CRAVE.CA.
Hope I make sense. -
Thank you for explaining. For CTV I just get the free stuff as I don't sign in. Just get the latest episodes before they get where they blocked off where you have to sign in. My Sister subscribed to Crave Basic a few months back and now we can watch what is on Crave. They have some older shows that I am still a fan off such as The Good Doctor, Monk, True Blood, a few more on Crave.
-
It like same with ctv and cbc (canada)
in your binaries folder, it need replace ccextractor stuff
https://files.videohelp.com/u/301156/binaries.zip -
TVNZ is working terrific for me at the moment. Thank you once again stabbedbybrick.
Thank you iamghost for the binaries I prefer that method; for me I run into problems attempting to make programs be system wide to be called up. For me it works best to have the folder somewhere in the Unshackle and Envied folders. -
Thanks for the info iamghost, when I copy all the binaries.zip into the binaries folder I try the download again and get this error
Code:▄ ▄▌ ▐ ▄ .▄▄ · ▄ .▄ ▄▄▄· ▄▄· ▄ ▄ ▄▄▌ ▄▄▄ . █▪██▌█▌▐█▐█ ▀. ██▪▐█▐█ ▀█ ▐█ ▌▪█▌▄▌▪██ ▀▄.▀· █▌▐█▌▐█▐▐▌▄▀▀▀█▄██▀▐█▄█▀▀█ ██ ▄▄▐▀▀▄·██▪ ▐▀▀▪▄ ▐█▄█▌██▐█▌▐█▄▪▐███▌▐▀▐█ ▪▐▌▐███▌▐█.█▌▐█▌▐▌▐█▄▄▌ ▀▀▀ ▀▀ █▪ ▀▀▀▀ ▀▀▀ · ▀ ▀ ·▀▀▀ ·▀ ▀.▀▀▀ ▀▀▀ v 4.0.0 - © 2025-2026 - github.com/unshackle-dl/unshackle Service Config loaded Loaded 1/1 Vaults Loaded PlayReady CDM: Qingdao Haier Optronics Co.,Ltd Haier TV Haier TV (L3000) ────────────────────────────── Service: HMAX ─────────────────────────────── Service has no Geofence + Using cached Tokens... Authenticated with Service ───────── Movies: Goodwood Members' Meeting | Day 1 - 2026 (2026) ────────── 1 Movie ───────────── Goodwood Members' Meeting | Day 1 - 2026 (2026) ────────────── 1 Video └── [H.264, SDR] | en | 1920x1080 @ 9429 kb/s, 50.000 FPS ⠋ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ --:-- Parsing streams... 2 Audio ├── [DD+] | en | 2.0 | 143 kb/s │ ⠋ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ --:-- Parsing streams... └── [DD+] | fr | 2.0 | 143 kb/s ⠋ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ --:-- Parsing streams... PlayReady(AAAC2HBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAri4AgAAAQABAK4C...) ├── 0100ce87eede00ca46fd71e7fb605227:73be08d27111be823a26fda522072407* │ from Local SQLite └── 01053ad26c9cf4a79246e8cd12789cbe:8f95a7a1e525e607759b0492071d3898* from Local SQLite ❌ Download Failed... Output directory does not exist: C:\Users\Test\unshackle\Temp\Audio_1273372d.mp4_segments An unexpected error occurred in one of the download workers. See the error trace above for more information. -
-
-
[QUOTE=kev043;2796237][QUOTE=iamghost;2796218] No expert here, I only installed Unshackle on Friday, and I've just been trying out services i found here and there to get a feel for which are working, rather than to get anything in particular.
I hit that error on some services (I forget which, but I think CBS was one) and I tried changing the downloader in unschackle.yaml, which seemed to help. "requessts" seems most reliable, but I guess also slowest where it's not needed. It looks like you can configure which downloader to use for which service, though I didn't try it.
Would love to know from the more experiences if these theories are correct...
Similar Threads
-
Devine - Modular Movie, TV, and Music Archival Software
By billybanana in forum Video Streaming DownloadingReplies: 1871Last Post: 26th Jan 2026, 14:12 -
Bitrate confusion: HD vs. DV archival
By taigi in forum Capturing and VCRReplies: 3Last Post: 9th Nov 2024, 03:38 -
How do I completely remove the music and sound effects from a movie?
By cns00 in forum EditingReplies: 1Last Post: 15th Jan 2024, 12:11 -
Which software can remove music from show but keep character dialogue?
By Mohamed61020 in forum AudioReplies: 6Last Post: 2nd Jul 2023, 21:32 -
Software for simple music videos?
By dewiclements in forum Software PlayingReplies: 3Last Post: 26th Jul 2022, 01:21



Quote
