일하면서 자주 듣는 음악 플레이 리스트가 있습니다. 이것을 유튜브 재생목록에 넣어 듣고 있습니다. 그런데 이 노동요 패턴에 문제가 있습니다. 브라우저를 열면, 함께 열어 놓은 탭들 때문에 컴퓨터의 램이 불필요하게 많이 소모됩니다.

이 문제를 해결하기 위해 유튜브 링크를 mp3로 변환하여 다운로드를 하던 중 갑자기 챗지피티에게 글코딩으로 자동 다운로드 프로그램을 만들어 달라고 하면 어떻게 될지 궁금했습니다. 그래서 실행했고, 결과는 대성공!

아래와 같이 기록으로 남깁니다.

1. 준비물

  • vscode가 필요합니다.
  • 챗지피티가 필요합니다.
  • 윈도우용 ffmpeg 설치가 필요합니다.
    <윈도우용 ffmpeg 설치 방법>
    Windows에서 choco를 사용하여 ffmpeg를 설치하는 방법은 다음과 같습니다.
  1. Chocolatey 설치 확인: 먼저 choco가 설치되어 있는지 확인합니다. 명령 프롬프트 또는 PowerShell을 열고 다음 명령어를 입력하세요.

    choco -v
    

    choco 버전이 출력되면 설치된 상태입니다. 만약 설치되지 않았다면 Chocolatey 설치 가이드에서 설치 방법을 참고하여 설치하세요.

  2. ffmpeg 설치: choco를 사용하여 ffmpeg를 설치합니다. 관리자 권한으로 명령 프롬프트나 PowerShell을 실행하고 다음 명령어를 입력하세요.

    choco install ffmpeg -y
    
  3. 설치 확인: 설치가 완료되면 ffmpeg가 제대로 설치되었는지 확인합니다. 명령 프롬프트나 PowerShell에서 다음 명령어를 입력합니다.

    ffmpeg -version
    

    ffmpeg 버전 정보가 출력되면 정상적으로 설치된 것입니다.

이제 ffmpeg가 설치되어 Python 스크립트에서 pydub를 통해 오디오 파일을 MP3로 변환할 수 있습니다.

2. 글코딩 순서

(입력)

파이썬으로 playlist.txt 파일에 있는 유튜브 링크의 영상을 다운로드 받은 후 mp3의 320kps 음질로 변환하는 실행 프로그램을 만들어줘. 가상환경에서 실행되도록 구성해줘.

(결과)

가상환경을 사용하여 유튜브 링크에서 오디오를 다운로드하고 MP3로 변환하는 스크립트를 작성하려면, 먼저 가상환경을 생성하고 필요한 패키지를 설치한 후 코드를 실행하도록 하면 됩니다. 다음은 단계별 가이드입니다.

가상환경 설정

먼저, 프로젝트 폴더를 생성하고 그 안에서 가상환경을 설정하세요.

# 프로젝트 폴더 생성
mkdir youtube_mp3_downloader
cd youtube_mp3_downloader

# 가상환경 생성
python -m venv venv

# 가상환경 활성화 (Windows)
.\venv\Scripts\activate

# 가상환경 활성화 (MacOS/Linux)
source venv/bin/activate

패키지 설치

가상환경이 활성화된 상태에서 pytube, pydub, ffmpeg를 설치합니다.

pip install pytube pydub

참고: ffmpeg는 별도로 설치해야 합니다. Mac에서는 brew install ffmpeg, Ubuntu에서는 sudo apt-get install ffmpeg 명령어를 사용하여 설치할 수 있습니다.

파이썬 코드 작성

아래 코드를 download_youtube_playlist.py라는 이름의 파일로 저장하세요.

import os
from pytube import YouTube
from pydub import AudioSegment

# YouTube 동영상을 다운로드하고 MP3 파일로 변환하는 함수
def download_and_convert_to_mp3(url, output_folder="downloads", bitrate="320k"):
    yt = YouTube(url)
    title = yt.title.replace(" ", "_").replace("/", "_")
    audio_stream = yt.streams.filter(only_audio=True).first()
    
    # 다운로드 폴더 생성
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # 오디오 파일 다운로드
    audio_file_path = os.path.join(output_folder, f"{title}.mp4")
    audio_stream.download(output_path=output_folder, filename=f"{title}.mp4")
    
    # MP4를 MP3로 변환
    mp3_file_path = os.path.join(output_folder, f"{title}.mp3")
    audio = AudioSegment.from_file(audio_file_path)
    audio.export(mp3_file_path, format="mp3", bitrate=bitrate)
    
    # 원본 MP4 파일 삭제
    os.remove(audio_file_path)
    
    print(f"'{title}' 다운로드 및 변환 완료: {mp3_file_path}")

# playlist.txt 파일에 있는 모든 링크 다운로드 및 변환
def process_playlist(file_path="playlist.txt"):
    try:
        with open(file_path, "r") as file:
            urls = [line.strip() for line in file.readlines() if line.strip()]
        
        for url in urls:
            download_and_convert_to_mp3(url)
    except FileNotFoundError:
        print(f"'{file_path}' 파일을 찾을 수 없습니다.")
    except Exception as e:
        print(f"오류 발생: {e}")

# 실행
if __name__ == "__main__":
    process_playlist()

playlist.txt 파일 생성

playlist.txt 파일을 youtube_mp3_downloader 폴더에 생성하고, 다운로드할 유튜브 링크를 각 줄에 하나씩 입력하세요.

예:

https://www.youtube.com/watch?v=video_id1
https://www.youtube.com/watch?v=video_id2
...

가상환경에서 코드 실행

가상환경을 활성화한 상태에서 아래 명령어를 실행하여 스크립트를 실행하세요.

python download_youtube_playlist.py

그런데 돌아가지 않습니다. 그래서 다시 한번 요청했습니다.

(입력)

yt-dlp 이걸 사용해줘.

(결과)

yt-dlp 라이브러리는 pytube보다 더 안정적으로 유튜브 영상을 다운로드할 수 있으며, 최신 유튜브 페이지 변경 사항에 더 잘 대응합니다. 이를 이용해 playlist.txt 파일의 유튜브 링크를 다운로드하고, MP3 파일로 변환하는 코드를 작성해드리겠습니다.

라이브러리 설치

먼저 yt-dlppydub를 설치하세요. 가상환경이 활성화된 상태에서 다음 명령어를 실행합니다.

pip install yt-dlp pydub

pydubffmpeg에 의존하기 때문에 ffmpeg도 설치되어 있어야 합니다. ffmpeg는 앞서 설명한 대로 choco 등을 이용하여 설치할 수 있습니다.

Python 코드 작성

아래 코드를 download_youtube_playlist.py 파일로 저장하세요. 이 코드는 yt-dlp를 이용하여 유튜브 영상을 다운로드하고, MP3로 변환하여 320kbps의 비트레이트로 저장합니다.

import os
from yt_dlp import YoutubeDL
from pydub import AudioSegment

def download_and_convert_to_mp3(url, output_folder="downloads", bitrate="320k"):
    # 다운로드 폴더 생성
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # yt-dlp 설정
    ydl_opts = {
        'format': 'bestaudio/best',
        'outtmpl': os.path.join(output_folder, '%(title)s.%(ext)s'),
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '320',
        }],
    }

    try:
        # YouTube 다운로드
        with YoutubeDL(ydl_opts) as ydl:
            info_dict = ydl.extract_info(url, download=True)
            title = info_dict.get('title', 'unknown').replace(" ", "_").replace("/", "_")
            mp3_file_path = os.path.join(output_folder, f"{title}.mp3")

            # MP3 파일 변환 확인
            if os.path.exists(mp3_file_path):
                print(f"'{title}' 다운로드 및 변환 완료: {mp3_file_path}")
            else:
                print(f"'{title}' 변환에 실패했습니다.")
    except Exception as e:
        print(f"'{url}' 다운로드 및 변환 중 오류 발생: {e}")

def process_playlist(file_path="playlist.txt"):
    try:
        with open(file_path, "r") as file:
            urls = [line.strip() for line in file.readlines() if line.strip()]
        
        for url in urls:
            download_and_convert_to_mp3(url)
    except FileNotFoundError:
        print(f"'{file_path}' 파일을 찾을 수 없습니다.")
    except Exception as e:
        print(f"오류 발생: {e}")

if __name__ == "__main__":
    # 현재 디렉토리에서 playlist.txt 파일을 찾음
    current_directory = os.path.dirname(os.path.abspath(__file__))
    playlist_file = os.path.join(current_directory, "playlist.txt")
    
    process_playlist(playlist_file)

파이썬 코드를 실행했습니다. 1분도 안되어 제가 자주 듣는 mp3 파일이 제 컴퓨터에 만들어졌습니다. 정말 재밌고 신기한 세상입니다. 여러분도 위의 코드를 활용하거나, 챗지피티로 직접 만들어 보세요.