Search code examples
pythonpycharmpytube

Using pytube on PyCharm


I have a script, which has been working fine in April 2021 when I created it, but now it gives me the following error. I'm not very experienced in coding, so if anyone can help me it would be great.

What I'm trying to do is simply download a song from youtube as a mp4. I can see that the error says there is something wrong with the pytube module imported, but I am not skilled enough to see what it is.

I'm using MacOS 12.1, Pycharm 2020.3, and Python 3.9.

Script:

import pytube

url = str('https://www.youtube.com/watch?v=gJLIiF15wjQ')
youtube = pytube.YouTube(url)
video = youtube.streams.get_by_itag(140)
video.download(output_path='/Users/clarajacobsen/Documents/TrueFIR/Klub100/Songs/', filename='test')

Error:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/test.py", line 8, in <module>
    video = youtube.streams.get_by_itag(140)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 292, in streams
    return StreamQuery(self.fmt_streams)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 177, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 43, in __init__
    self.throttling_plan = get_throttling_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 387, in get_throttling_plan
    raw_code = get_throttling_function_code(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 301, in get_throttling_function_code
    code_lines_list = find_object_from_startpoint(js, match.span()[1]).split('\n')
AttributeError: 'NoneType' object has no attribute 'span'

After trying out solution 1, suggested by Sarim, error in PyCharm:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 177, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 29, in __init__
    self.transform_plan: List[str] = get_transform_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 197, in get_transform_plan
    return regex_search(pattern, js, group=1).split(";")
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/helpers.py", line 129, in regex_search
    raise RegexMatchError(caller="regex_search", pattern=pattern)
pytube.exceptions.RegexMatchError: regex_search: could not find match for iha=function\(\w\){[a-z=\.\(\"\)]*;(.*);(?:.+)}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/test.py", line 5, in <module>
    video = youtube.streams.get_by_itag(140)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 292, in streams
    return StreamQuery(self.fmt_streams)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 184, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 29, in __init__
    self.transform_plan: List[str] = get_transform_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 197, in get_transform_plan
    return regex_search(pattern, js, group=1).split(";")
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/helpers.py", line 129, in regex_search
    raise RegexMatchError(caller="regex_search", pattern=pattern)
pytube.exceptions.RegexMatchError: regex_search: could not find match for iha=function\(\w\){[a-z=\.\(\"\)]*;(.*);(?:.+)}

After trying to run it in Google Colab:

/usr/local/lib/python3.7/dist-packages/pytube/cipher.py in get_throttling_function_code(js)
    299 
    300     # Extract the code within curly braces for the function itself, and merge any split lines
--> 301     code_lines_list = find_object_from_startpoint(js, match.span()[1]).split('\n')
    302     joined_lines = "".join(code_lines_list)
    303 

AttributeError: 'NoneType' object has no attribute 'span'

Solution

  • To fix this issue, This doesnt depends on which operating system you are on or which python you are using. Follow these steps:

    1. I used Colab for this, if you are using Google colab use it and test it.
    2. Install Pytube with !pip install pytube
    3. After installing pytube just shutdown the kernel and the application you are using for it. either VSCode, Jupyter notebook or Colab. shut down its kernel.
    4. Then run the enviroment again and try importing and running your code.
    5. It should run now.

    or if it gives you the same error as before:

    1. Go to the files where pytube is install and go to folder in pytube named "pytube" then go into "cipher.py" and open it.
    2. Search for the line: 293. Where name = re.escape(get_throttling_function_name(js))
    3. Replace name = "iha"
    4. Then close all kernels and file you are running the code on. and restart them completely after shutting down.

    These two solutions should work 100%. Solution that worked for me is first one.