2022.04.26 - 파이썬 유튜브 음원 추출 프로그램

1 분 소요

파이썬 유튜브 음원 추출 프로그램

  • 유튜브 음원이 필요하여 다운 받고 싶었는데, 구글에 유튜브 음원 추출을 찾으면 뭔가 들어가기만 해도 바이러스 걸릴 것 같은 사이트만 수두룩 빽빽하여 파이썬으로 만들어보았다.

pytube

  • 우선 pytube라는 라이브러리 설치를 해야한다. (나는 가상환경을 사용하여 진행하였다.)

  • 터미널 창에 아래의 문구를 입력한다.

pip install pytube
  • pytube 버전 가상환경 라이브러리

라이브러리 테스트 및 수정

  • 작성하는 도중 알게 되었는데, pytube 12.0.0 버전의 라이브러리는 정규표현식에 오류가 있어 현재 유튜브에서 사용이 불가능하여 라이브러리 코드를 변경해주어야한다.
  • 향후 pytube에서 수정이 될지도 모르니 먼저 테스트로 돌려보고 안될시 변경해주면 된다.

  • 현재 코드
from pytube import YouTube

# 영상 다운로드
YouTube('https://youtu.be/uBsAV3KJfcU').streams.first().download()

  • 기본적인 코드로 테스트를 진행해보았는데, 아래와 같은 에러가 나왔다.

에러

  • 구글링한 결과 라이브러리 안에 cipher.py 내에 get_throttling_function_name

라이브러리 문제 해결 방법(문제 없이 원하는 파일이 다운로드 될 때는 패스)

참조 링크

  • 유튜브의 함수 패턴이 바뀌어 정규표현식을 수정해주어야 한다.

  • VSCode의 경우 Command + p를 누르면 사용중인 파일을 탐색할 수 있다. command+p)

  • cipher.py의 클래스 get_throttling_function_name의 코드를 수정해주어야 한다

  • 현재 코드 현재 코드

  • 현재 코드 function_patterns를 수정해주면 정상적으로 실행이 된다.

function_patterns = [
        # https://github.com/ytdl-org/youtube-dl/issues/29326#issuecomment-865985377
        # https://github.com/yt-dlp/yt-dlp/commit/48416bc4a8f1d5ff07d5977659cb8ece7640dcd8
        # var Bpa = [iha];
        # ...
        # a.C && (b = a.get("n")) && (b = Bpa[0](b), a.set("n", b),
        # Bpa.length || iha("")) }};
        # In the above case, `iha` is the relevant function name
        r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*'
        r'\([a-z]\s*=\s*([a-zA-Z0-9$]{2,3})(\[\d+\])?\([a-z]\)'
    ]

본격 코드 작성

  • 뭐 기본적으로 유튜브 음원만 추출 하는 기능만 필요하다면 사실상 아래의 코드만 집어넣어도 완성이다.
from pytube import YouTube

#유튜브 전용 인스턴스 생성
yt = YouTube('https://youtu.be/uBsAV3KJfcU')

print(yt.streams.filter(only_audio=True).all())

# 특정영상 다운로드
yt.streams.filter(only_audio=True).first().download()

print('추출 완료')
  • 그런데 나는 여러 영상을 더 원하기 때문에 input() 기능과 무한 루프 기능을 추가하여 마무리 하였다.
from pytube import YouTube

while True:
    url = input('추출할 URL을 입력하세요. ')
    #유튜브 전용 인스턴스 생성
    yt = YouTube(url)

    print(yt.streams.filter(only_audio=True).all())

    # 특정영상 다운로드
    yt.streams.filter(only_audio=True).first().download()

    print('추출 완료')

카테고리:

업데이트:

댓글남기기