pytube: KeyError: 'cipher'

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=3AtDnEC4zak')

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/extract.py in apply_descrambler(stream_data, key)
    296                 }
--> 297                 for format_item in formats
    298             ]

~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/extract.py in <listcomp>(.0)
    296                 }
--> 297                 for format_item in formats
    298             ]

KeyError: 'url'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-3-bc6543d387ce> in <module>
----> 1 yt = YouTube('https://www.youtube.com/watch?v=3AtDnEC4zak')

~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/__main__.py in __init__(self, url, defer_prefetch_init, on_progress_callback, on_complete_callback, proxies)
     90         if not defer_prefetch_init:
     91             self.prefetch()
---> 92             self.descramble()
     93 
     94     def descramble(self) -> None:

~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/__main__.py in descramble(self)
    130             if not self.age_restricted and fmt in self.vid_info:
    131                 apply_descrambler(self.vid_info, fmt)
--> 132             apply_descrambler(self.player_config_args, fmt)
    133 
    134             if not self.js:

~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/extract.py in apply_descrambler(stream_data, key)
    299         except KeyError:
    300             cipher_url = [
--> 301                 parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
    302             ]
    303             stream_data[key] = [

~/.conda/envs/Karaoke/lib/python3.7/site-packages/pytube/extract.py in <listcomp>(.0)
    299         except KeyError:
    300             cipher_url = [
--> 301                 parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
    302             ]
    303             stream_data[key] = [

KeyError: 'cipher'

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 14
  • Comments: 54

Commits related to this issue

Most upvoted comments

Does #643 fix this for you guys?

Yes, I have the same error and fixed it as suggested:

except KeyError: cipher_url = [ parse_qs(formats[i][“signatureCipher”]) for i, data in enumerat$ ]

When can we expect a release with the fix?

Just go to the pytube\extract.py (in pytube library)file: the path of file will be : “C:\ProgramData\Anaconda3\lib\site-packages\pytube\extract.py”, (in windows)

Open extract,py file and search for line: parse_qs(formats[i][“cipher”]) for i, data in enumerate(formats)

now replace ‘cipher’ with ‘signatureCipher’.

save it.

now run your code again

While waiting for the maintainer to address these PRs, feel free to use our public version with #643 merged in:

https://gitlab.com/obuilds/public/pytube

I use GitLab because I am a savage

You can install the tagged version like so:

pip install git+https://gitlab.com/obuilds/public/pytube@ob-v1

or add the following to your requirements.txt

git+https://gitlab.com/obuilds/public/pytube@ob-v1

Hopefully our boy sees these MRs soon and gets a new release out.

@pranshukharkwal @Suji04 I upgraded and it worked!!!

The below code is working :

!pip install git+https://gitlab.com/obuilds/public/pytube@ob-v1 --upgrade from pytube import YouTube yt = YouTube(‘https://www.youtube.com/watch?v=-tJYN-eG1zk’)

@Suji04 @yogesh-12 Install the package from the GitLab repository shared by @kbuilds in Google Colab. Check the code below

!pip install git+https://gitlab.com/obuilds/public/pytube@ob-v1 from pytube import YouTube yt = YouTube('https://www.youtube.com/watch?v=-tJYN-eG1zk') `

Why don’t you try the maintained fork of pytube, pytubex

extract.py line 295

stream_data[key] = [
                {
                    "url": format_item["url"]), <----- No more url  replaced with signatureCipher
                    "type": format_item["mimeType"],
                    "quality": format_item["quality"],
                    "itag": format_item["itag"],
                    "bitrate": format_item.get("bitrate"),
                    "is_otf": (format_item.get("type") == otf_type),
                }
                for format_item in formats
            ]

Believe this is fixed in most recent version of Pytube @irahorecka @Joedmin580 @anonymous770

Let me know if this still doesnt work – thanks

Guys i figured it out:

For ’ Too Many values to unpack error:

https://github.com/nficano/pytube/pull/701/commits/773866382c3412e01f97f242e753cf32f52aaefa#diff-e5b8b42cf1afd9ee025a9e6d48697ca0

Go to this link and Replace all the data inside your cipher file with the given inside the link.It’ll work.

Looks like someone is a fan of Queen