본문 바로가기
Python

유튜브 재생목록 음악 다운로드

by holy season 2024. 3. 22.
반응형

프로그램의 목적

음악을 재생하는 프로그램을 테스트 하기 위해 mp3 파일 샘플들이 필요했다.

원래 mp3 파일을 youtube studio에서 다운받아 사용했었는데 youtube studio에 있는 노래들은 가사가 없는 노래가 대다수이고 인터넷에 있는 youtube음악 변환 사이트는 광고가 많고 한번 변환하는데 시간이 많이 걸려 가사 있는 노래를 얻기 위해 youtube 재생목록에 있는 음악들을 다운로드 하는 프로그램을 만들어 보기로 하였다.

 

검색을 해보니 pytube라는 파이썬 라이브러리를 사용하면 youtube음악을 쉽게 다운 받을 수 있는 거 같아 이 라이브러리를 사용해 보기로 하였다.

전체 코드

import os
import datetime
import requests
import re
from pytube import YouTube
from urllib.parse import urlparse, parse_qs, urlencode
import threading

# 오늘 날짜로 폴더 생성
today = datetime.date.today().strftime("%Y-%m-%d")
if not os.path.exists(today):
    os.mkdir(today)

url = input("음악 다운로드할 재생 목록을 입력해주세요. :")

# 입력된 url에 list 값으로 폴더 생성
parsed_url = urlparse(url)
parsed_query_string = parse_qs(parsed_url.query)
dir_name = parsed_query_string.get("list")[0]
if not os.path.exists(os.path.join(today, dir_name)):
    os.mkdir(os.path.join(today, dir_name))

# 파싱한 결과 저장
file = os.path.join(today, dir_name, "{file_name}.txt".format(file_name=dir_name))
if not os.path.exists(file):
    response = requests.get(url)
    if response.status_code == 200:
        html = response.text
        with open(file, "w", encoding="utf-8") as f:
            f.write(html)

# 저장된 결과 불러오기
with open(file, "r", encoding="utf-8") as f:
    html = f.read()

# 정규표현식으로 videoId 파싱
pattern = re.compile('"videoId":"\\w+"')
result = pattern.findall(html)

# 값 추출 및 중복 제거
videoId = [value.replace('"', "").split(":")[1] for value in result]
videoId = list(set(videoId))

def download(url, path):
    youtube = YouTube(url)
    output = youtube.streams.filter(only_audio=True).first().download(output_path=path)
    os.rename(output, output.replace("mp4", "mp3"))

for id in videoId:
    parsed_query_string.clear()
    parsed_query_string['v'] = id
    parsed_url = parsed_url._replace(query=urlencode(parsed_query_string))
    
    download_thread = threading.Thread(target=download, args=(parsed_url.geturl(), os.path.join(today, dir_name)))
    download_thread.start()

결과

설명

이 프로그램은 youtube 음악 재생목록에 있는 videoId값을 얻어와 pytube 라이브러리를 사용해 유튜브 음악을 다운로드 한다.

 

밑에 있는 주소를 입력하면 사이트에서 videoId를 찾아 오늘 날짜/list 값 폴더/videoId 음악파일들이 생성된다.

https://www.youtube.com/watch?v=D1PvIWdJ8xo&list=RDCLAK5uy_nCE7QXtNLQGa2k3EkP57qYoX7l-JV5uPE&index=3

 

왼쪽에 보이는 재생 목록에 있는 주소를 얻어와 음악을 다운로드 하는 프로그램을 만들고 싶었지만 Youtube가 javascript로 만들어진게 많아서 원하는 주소를 받아올 수 없었다.

 

그래서 다른방법을 찾기 위해  페이지 소스를 보다가 videoId라는 값을 youtube의 쿼리 스트링으로 넘겨주면 동영상 주소로 이동할 수 있다는 것을 알아내었다.

 

이걸 활용해 페이지에서 videoId값을 찾아 여러 개의  www.youtube.com/watch?v=videoId 주소 형태로 만들고 threading 모듈로 pytube로 유튜브 동영상을 여러개 다운받을 수 있게 만들었다.

 

그런데 이 videoId가 원했던 동영상이 아닌  주소도 여러개 포함되어 있어 다른 방법을 찾아야 할거 같다.

반응형

'Python' 카테고리의 다른 글

Poetry  (0) 2023.11.09
Pyside6 캘린더 위젯 특정 날짜 클릭 막기  (0) 2023.11.06
kt 지니 Voice 사용해보기  (0) 2023.10.10
랜덤 문자열 만들기  (0) 2023.08.30
파이썬 로깅 사용하기  (0) 2023.08.26